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

时间:2018-11-10 21:32:07

标签: 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 |

1 个答案:

答案 0 :(得分:4)

这是一个空白和空缺的问题

  

岛屿和空白出现在各种序列中,无论是行号列,其中某些行已被删除,还是按顺序出现的日期(但有些缺失)。

您可以尝试在子查询中按数字为缺口组创建grp列,然后可以在主查询的group bygrp列上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

sqlfiddle

结果

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