在 PostgreSQL 中对连续的行进行分组

Group contiguous rows in PostgreSQL

鉴于此 table:

| 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 在主查询中的 grpX 列查询并得到 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

sqlfiddle

结果

x   c
=====
A   2
B   4
A   3