3

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

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

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

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

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

4

2 回答 2

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;
于 2013-05-03T16:10:50.737 回答
1
create temporary sequence s minvalue 0 start with 0;

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

drop sequence s;

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

于 2013-05-03T16:49:32.493 回答