1

如何将长度为 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。

4

1 回答 1

2

如果您的 ID 确实是连续且无间隙的,则可以使用id % 4 + 1. 但我想实际上你的 ID 并不是那么有序,如果它们是从 a 生成的,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在列表中作为 set-returning-function 使用SELECT,但这是 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;
于 2012-12-08T03:54:58.520 回答