Postgresql 如何使用重复的1,2,3,4,1,2,3,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不是那么有序,如果它们是从序列生成的,你就不应该依赖它们是无间隙的 您可以使用行编号()正确执行此操作,如下所示: 也可

如何将长度为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不是那么有序,如果它们是从
序列生成的,你就不应该依赖它们是无间隙的

您可以使用
行编号()
正确执行此操作,如下所示:

也可以使用
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;