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

标签 sql postgresql group-by gaps-and-islands

给定这张表:

| 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 bygrpX主查询中的列并获得 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

关于sql - 在 PostgreSQL 中对连续的行进行分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53243612/

相关文章:

php - 表字段(数据库)中坐标的集合

php - 在 ZF2 上如何使用表达式而不是引用的表名?

java - 在 java Jtable 上显示 postgresql 日期

python - Pandas groupby 最大总和

MySQL : Group count specific column per user?

mysql - jsp中palette(数据库报表)生成的sql语句没有结果时如何显示错误信息

SQL 返回落在期间和范围内的日期

sql - 如何从 Ruby 直接将 SQL 与 MySQL 对话?

sql - 使用 postgres_fdw 执行远程查询,使用索引

mysql - 需要获取最近 10 个活跃主题的用户