给定这张表:
| i | x |
+---+---+
| 1 | A |
| 2 | A |
| 3 | B |
| 4 | B |
| 5 | B |
| 6 | B |
| 7 | A |
| 8 | A |
| 9 | A |
如何将共享相同字母(在 x 列中)的行分组以获得以下输出?
| x | c |
+---+---+
| A | 2 |
| B | 4 |
| A | 3 |
此外,我想输出已分组的行数(显示在 c 列中)。
我尝试了以下 SQL 查询:
SELECT x, count(*) c
FROM table_name
GROUP BY x
这个查询虽然将所有行都用相同的值分组,但这不是我想要的,因为结果与我想要的不匹配。两个 A 组被组合在一起,而不是将它们分开。
| x | c |
+---+---+
| A | 5 |
| B | 4 |
最佳答案
这是一个缺口和孤岛问题
Islands and gaps appear in all sorts of sequences, be they row number columns where some rows have been removed or dates that occur in sequence (but some are missing).
你可以尝试制作grp
在子查询中按数字分组的列,那么你可以 group by
在 grp
和 X
主查询中的列并获得 count
select X,COUNT(grp) c
from (
SELECT *,
ROW_NUMBER() OVER(ORDER BY i) - ROW_NUMBER() OVER(PARTITION BY X ORDER BY i) grp
FROM table_name
) t1
group by grp,X
结果
x c
=====
A 2
B 4
A 3
关于sql - 在 PostgreSQL 中对连续的行进行分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53243612/