将记录分组 - 快速解决方案

时间:2013-05-03 15:49:25

标签: postgresql select random grouping sequence

我需要将PostgreSQL表中的UPDATE命令行(从subselect中选择)划分为组,这些组将在其中一列中用整数值标识。这些组的大小应相同。源表包含数十亿条记录。

例如,我需要将213个选定的行分成组,每个组应包含50个记录。结果将是:

  • 1 - 50. row => 1
  • 51 - 100. row => 2
  • 101 - 150. row => 3
  • 151 - 200. row => 4
  • 200 - 213. row => 5

使用一些循环(或使用PostgreSQL窗口函数)没有问题,但我需要非常有效和快速地完成它。我不能在id中使用序列,因为这些ID中应该存在间隙。

我有一个想法是使用随机整数生成器并将其设置为行的默认值。但是当我需要调整组大小时,这是不可用的。

2 个答案:

答案 0 :(得分:5)

下面的查询应显示213行,组号从0到4。如果你想要1-5,只需加1即可。

SELECT i, (row_number() OVER () - 1) / 50 AS grp 
FROM generate_series(1001,1213) i 
ORDER BY i;

答案 1 :(得分:1)

create temporary sequence s minvalue 0 start with 0;

select *, nextval('s') / 50 grp
from t;

drop sequence s;

我认为它有可能比row_number版本@Richard更快。但根据具体情况,差异可能无关紧要。