在Postgres中创建Bin列以检查整数并返回一个字符串

时间:2018-05-24 21:39:19

标签: postgresql postgresql-9.5

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

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

我真的想找到一种更有效的方法来做到这一点,对所有事情都开放!主要目标是查看此“testint”列中的整数,然后查看测试组列“0-100”中的1-100之间的返回值。

2 个答案:

答案 0 :(得分:1)

使用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语句:

UPDATE test
   SET testgroup = width_bucket(testint, 0, 5001, 50)-1)*100 || ' - ' || 
                   width_bucket(testint, 0, 5001, 50)*100

答案 1 :(得分:0)

您可以使用generate_series生成0到50之间的数字,然后选择生成值* 100和下一个生成值* 100之间的数据。使用相同的原则构建bin名。

UPDATE test
SET testgroup = (x*100)+1 || '-' || (x+1)*100
FROM generate_series(0,50) f(x)
WHERE testint > (x*100) 
  AND testint <= ((x+1)*100);

http://rextester.com/FXIS37706

相关问题