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

Postgresql 在Postgres中创建Bin列以检查整数并返回字符串,postgresql,postgresql-9.5,Postgresql,Postgresql 9.5,我在Postgres db中有一个大数据集,需要生成一个字段,将行分组到“0-100”、“101-200”、“201-300”等相应的bin中,一直到将近5000行。我知道我可以手动更新每一行,并为每个箱子生成一行代码,如下所示: update test set testgroup = '0-100' where testint >= 1 and distance < 100; 更新测试 设置testgroup='0-100',其中testint>=1,距离(x*100) 和

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

update test
   set testgroup = '0-100' where testint >= 1 and distance < 100;
更新测试
设置testgroup='0-100',其中testint>=1,距离<100;

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

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

更新测试
设置测试组=(x*100)+1 | |'-'| |(x+1)*100
从生成_系列(0,50)f(x)
其中testint>(x*100)

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

更新测试
设置测试组=(x*100)+1 | |'-'| |(x+1)*100
从生成_系列(0,50)f(x)
其中testint>(x*100)

测试使用
width\u bucket
功能。请参见,但下面是语法的简短版本:

width_bucket(a, LBound, UBound, num_bins)
为了让它正常工作,为您的垃圾箱,我必须添加1到UBound。一些例子:

选择铲斗宽度(1,0,5001,50)
给出1
选择铲斗宽度(100,0,5001,0)
给出1
select width\u bucket(101,05001,50)
2
选择铲斗宽度(4900,05001,50)
给出49
选择铲斗宽度(4901,05001,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

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

width_bucket(a, LBound, UBound, num_bins)
为了让它正常工作,为您的垃圾箱,我必须添加1到UBound。一些例子:

选择铲斗宽度(1,0,5001,50)
给出1
选择铲斗宽度(100,0,5001,0)
给出1
select width\u bucket(101,05001,50)
2
选择铲斗宽度(4900,05001,50)
给出49
选择铲斗宽度(4901,05001,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

每行上都有唯一的标识符吗?在示例代码中,比较变量不应该相同吗?i、 e.testint>=1和testint<100抱歉,这是一个打字错误。我真的不想写那一行,也不想手动更新50次。行有唯一标识符。每行上有唯一标识符吗?在示例代码中,比较变量不应该相同吗?i、 e.testint>=1和testint<100抱歉,这是一个打字错误。我真的不想写那一行,也不想手动更新50次。这些行确实有唯一的标识符。这有着指数级的帮助。非常感谢。这起到了指数级的帮助。非常感谢。您好,我正在使用类似的binning方法,发现您的代码很有用。虽然我似乎不太明白。关于“从生成_级数(0,50)f(x)”的部分。虽然我理解逻辑,但无法理解语法。这里f(x)是什么意思-函数?或者另一个数据集,如generate_series(0,50)@KanduriR,
f
是输出的表别名,
(x)
用于重命名列。这里因为
generate_series
的输出是一个列,所以它实际上并没有增加多少内容。假设您有一个表
mytable
,有3列
x,y,z
,您可以从mytable a(a,b,c)中执行
选择*
,列将显示为
a,b,c
,而不是
x,y,z
,现在明白了。谢谢@JGH。这个符号是postgres特有的还是SQL语言中的通用符号?您好,我正在使用类似的binning方法,发现您的代码很有用。虽然我似乎不太明白。关于“从生成_级数(0,50)f(x)”的部分。虽然我理解逻辑,但无法理解语法。这里f(x)是什么意思-函数?或者另一个数据集,如generate_series(0,50)@KanduriR,
f
是输出的表别名,
(x)
用于重命名列。这里因为
generate_series
的输出是一个列,所以它实际上并没有增加多少内容。假设您有一个表
mytable
,有3列
x,y,z
,您可以从mytable a(a,b,c)中执行
选择*
,列将显示为
a,b,c
,而不是
x,y,z
,现在明白了。谢谢@JGH。这个符号是postgres特有的还是SQL语言中的通用符号?