CREATE TABLE entries (
id serial NOT NULL,
title character varying,
load_sequence integer
);
和数据
INSERT INTO entries(title, load_sequence) VALUES ('A', 1);
INSERT INTO entries(title, load_sequence) VALUES ('A', 2);
INSERT INTO entries(title, load_sequence) VALUES ('A', 3);
INSERT INTO entries(title, load_sequence) VALUES ('A', 6);
INSERT INTO entries(title, load_sequence) VALUES ('B', 4);
INSERT INTO entries(title, load_sequence) VALUES ('B', 5);
INSERT INTO entries(title, load_sequence) VALUES ('B', 7);
INSERT INTO entries(title, load_sequence) VALUES ('B', 8);
在 PostgreSQL 中有没有一种方法可以编写 SQL,在按 load_sequence
对数据进行排序后,按相同的 title
段对数据进行分组。
我的意思是:
=# SELECT id, title, load_sequence FROM entries ORDER BY load_sequence;
id | title | load_sequence
----+-------+---------------
9 | A | 1
10 | A | 2
11 | A | 3
13 | B | 4
14 | B | 5
12 | A | 6
15 | B | 7
16 | B | 8
我想要群组:
=# SELECT title, string_agg(id::text, ',' ORDER BY id) FROM entries ???????????;
所以结果是:
title | string_agg
-------+-------------
A | 9,10,11
B | 13,14
A | 12
B | 15,16
最佳答案
您可以使用以下查询:
SELECT title, string_agg(id::text, ',' ORDER BY id)
FROM (
SELECT id, title,
ROW_NUMBER() OVER (ORDER BY load_sequence) -
ROW_NUMBER() OVER (PARTITION BY title
ORDER BY load_sequence) AS grp
FROM entries ) AS t
GROUP BY title, grp
计算的 grp
字段用于识别具有连续 load_sequence
值的 title
记录片段。在 GROUP BY
子句中使用此字段,我们可以实现对 id
值的所需聚合。
关于sql - 如何按不间断序列对条目进行分组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32349859/