给出此表:
| 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 |
答案 0 :(得分:4)
这是一个空白和空缺的问题
岛屿和空白出现在各种序列中,无论是行号列,其中某些行已被删除,还是按顺序出现的日期(但有些缺失)。
您可以尝试在子查询中按数字为缺口组创建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