假设我有一张这样的桌子:

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 bycol1在相邻行中具有相同的值,而在col2中也具有相同的组(col1中的id:9值和id:10中的col2值不能分组,因为它具有不同的值)
任何帮助都将不胜感激,谢谢!

最佳答案

关键思想是为相邻行获取分组标识符。问题是:对于应该组合在一起的行,行的哪些特征是常量?
好吧,这里有一个:对于组中的所有行,在idcol1中具有不同值的前几行(基于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;

注意:这在少量数据上足够有效,但它的伸缩性不是特别好。

10-06 12:51