我在Postgres数据库中有一个大数据集,需要生成一个字段,将行分组到一个对应的bin中,用于“0-100”、“101-200”、“201-300”等,一直到将近5000行。我知道我可以手动更新每一行并为每个bin生成一行代码,如下所示:

update test
   set testgroup = '0-100' where testint >= 1 and distance < 100;

我真的很想找到一个更有效的方法来做到这一点,对任何事情都开放!主要目标是查看这个“testint”列中的整数,然后如果它在testgroup列“0-100”中的返回值介于1-100之间。

最佳答案

使用width_bucket功能。请参见the docs,但以下是语法的简短版本:

width_bucket(a, LBound, UBound, num_bins)

为了让它在你的垃圾箱中正常工作,我必须在UBound中添加1。一些例子:
select width_bucket( 1, 0, 5001, 50)给出1
select width_bucket(100, 0, 5001, 0)给出1
select width_bucket(101, 0, 5001, 50)给出2
select width_bucket(4900, 0, 5001, 50)给出49
select width_bucket(4901, 0, 5001, 50)给出50
所以这和预期的一样。接下来我们需要生成正确的字符串。伪格式是
(width_bucket - 1)*100 || '-' || (width_bucket)*100

其中| |是SQL连接运算符。使用前面的第一个示例:
select (width_bucket(1, 0, 5001, 50)-1)*100 || ' - ' || width_bucket(1, 0, 5001, 50)*100

给出'0 - 100'
太好了。现在把它们放在一起。首先创建一个沙盒表,您可以使用它进行测试。这将是您的数据的副本或部分副本:
CREATE TABLE test
AS
SELECT *
FROM original_table

然后将新列添加到表中:
ALTER TABLE test
  ADD COLUMN testgroup text

现在更新语句:
UPDATE test
   SET testgroup = width_bucket(testint, 0, 5001, 50)-1)*100 || ' - ' ||
                   width_bucket(testint, 0, 5001, 50)*100

关于postgresql - 在Postgres中创建Bin列以检查整数并返回字符串,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50518548/

10-15 11:46