假设我有一张这样的桌子:
id col1 col2
---------------------
1 35 A
2 40 B
3 39 B
4 39 B
5 39 B
6 40 B
7 39 B
8 39 B
9 40 B
10 40 C
11 35 C
我该怎么做才能得到这样的结果:
id col1 col2
---------------------
1 35 A
2 40 B
3 39 B
6 40 B
7 39 B
9 40 B
10 40 C
11 35 C
我希望
group by
col1
在相邻行中具有相同的值,而在col2
中也具有相同的组(col1
中的id:9
值和id:10
中的col2
值不能分组,因为它具有不同的值)任何帮助都将不胜感激,谢谢!
最佳答案
关键思想是为相邻行获取分组标识符。问题是:对于应该组合在一起的行,行的哪些特征是常量?
好吧,这里有一个:对于组中的所有行,在id
或col1
中具有不同值的前几行(基于col2
)的数目是相同的。
可以将此观测值转换为每行的度量值(使用相关子查询)。剩下的只是聚合:
select min(id) as id col1, col2, count(*) as NumInGroup
from (select t.*,
(select count(*)
from t t2
where t2.id < t.id and (t2.col1 <> t.col1 or t2.col2 <> t.col2)
) as grp
from t
) t
group by grp, col1, col2;
注意:这在少量数据上足够有效,但它的伸缩性不是特别好。