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