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

问题描述 投票:0回答:3

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

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

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

postgresql postgresql-9.5
3个回答
4
投票

使用

width_bucket
功能。请参阅文档,但这里是语法的简短版本:

width_bucket(a, LBound, UBound, num_bins)

为了让它在你的垃圾箱中正常工作,我必须将 1 添加到 UBound。一些例子:

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

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


0
投票

一直到近5000

有时问题是上限未知,因此在需要上限的情况下,

width_bucket
可能并不理想。

但是老式的模数可能就足够了:

-- Explicit
SELECT  testint - testint % 100 || '-' || testint - testint % 100 + 100
FROM    (
    VALUES
    (256),
    (543),
    (33),
    (5611)
) AS q (testint)

-- Less duplicate operations
SELECT  left_end || '-' || left_end + 100
FROM  (
    VALUES
    (256),
    (543),
    (33),
    (5611)
) AS q (testint)
JOIN LATERAL (SELECT testint - testint % 100) l(left_end) ON TRUE;

两者都返回:

200-300
500-600
0-100
5600-5700
© www.soinside.com 2019 - 2024. All rights reserved.