Postgresql 如何使用重复的1,2,3,4,1,2,3,4对行进行编号,。。。系列
如何将长度为4的系列添加到如下表中: 源表:Postgresql 如何使用重复的1,2,3,4,1,2,3,4对行进行编号,。。。系列,postgresql,postgresql-9.1,window-functions,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。如果您的id确实是连续的并且没有间隙,那么您可以使用id%4+1。但我认为实际上你的ID不是那么有序,如果它们是从序列生成的,你就不应该依赖它们是无间隙的 您可以使用行编号()正确执行此操作,如下所示: 也可
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。如果您的id确实是连续的并且没有间隙,那么您可以使用
id%4+1
。但我认为实际上你的ID不是那么有序,如果它们是从序列生成的,你就不应该依赖它们是无间隙的
您可以使用行编号()
正确执行此操作,如下所示:
也可以使用generate_series
作为SELECT
列表中的一个set返回函数,但这是一个PostgreSQL扩展,而上述是标准SQL,可以在除MySQL之外的任何现代数据库中使用,MySQL不支持窗口函数
如果您真的想向表中添加一列,它会变得有点复杂。我不确定你为什么要这么做,但可以使用UPDATE。。。从
:
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;
+1包括示例数据、预期结果和PostgreSQL版本。这是一个奇怪的问题,我无法想象你为什么想要,但是嘿……”如果它们是从一个序列生成的,你不应该相信它们是无间隙的。“为什么?”(@Ali请参阅nextval
:的文档。基本上,如果事务回滚,从序列生成的条目不会重复使用。此处的其他注意事项:“%”的含义是什么?余数?@Ali它是模运算符。请参阅手册:
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;