我需要将PostgreSQL表中的UPDATE
命令行(从subselect中选择)划分为组,这些组将在其中一列中用整数值标识。这些组的大小应相同。源表包含数十亿条记录。
例如,我需要将213个选定的行分成组,每个组应包含50个记录。结果将是:
使用一些循环(或使用PostgreSQL窗口函数)没有问题,但我需要非常有效和快速地完成它。我不能在id中使用序列,因为这些ID中应该存在间隙。
我有一个想法是使用随机整数生成器并将其设置为行的默认值。但是当我需要调整组大小时,这是不可用的。
答案 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更快。但根据具体情况,差异可能无关紧要。