如何使用重复的1,2,3,4,1,2,3,4,...系列对行进行编号

时间:2012-12-07 12:28:14

标签: postgresql postgresql-9.1 window-functions

如何将长度为4的系列添加到这样的表中:

来源表:

id
1
2
3
4
5
6
7
8

结果表:

id    series
1     1
2     2
3     3
4     4
5     1
6     2
7     3
8     4

我正在使用PostgreSQL 9.1。

1 个答案:

答案 0 :(得分:2)

如果您的ID确实是连续且无间隙的,则可以使用id % 4 + 1。但我想,实际上你的ID不是那么有序,如果它们是从SEQUENCE生成的,你不应该依赖它们无间隙。

您可以使用row_number()正确完成此操作,如下所示:http://sqlfiddle.com/#!12/22767/5

SELECT 
  id,
  (row_number() OVER (ORDER BY id) - 1) % 4 + 1
FROM Table1
ORDER BY 1;

也可以在generate_series列表中使用SELECT作为set-returning-function,但这是PostgreSQL扩展,以上是标准SQL,可以在任何现代数据库中使用除了MySQL,它不支持窗口函数。

如果你想在表中实际添加一个列,它会变得有点复杂。我不确定你为什么要这样做,但可以使用UPDATE ... FROM

BEGIN;

ALTER TABLE table1 ADD COLUMN col2 INTEGER;

WITH gen_num(id,n) AS (
    SELECT
      id,
      (row_number() OVER (ORDER BY id) - 1) % 4 + 1
    FROM Table1
    ORDER BY 1)
UPDATE table1 SET col2 = n
FROM gen_num
WHERE gen_num.id = table1.id;

COMMIT;