2016-01-04 35 views
1

比方说,我有一个这样的表:集团通过相邻行基于两列

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:9id:10之间分组,因为它具有不同的col2值)

任何帮助,将不胜感激,谢谢!

回答

2

关键的想法是获取相邻行的分组标识符。问题是:对于应该组合在一起的行,行的特性是不变的?

嗯,这里是一个:在col1col2中具有不同值的先前行数(基于id)对于组中的所有行都是相同的。

您可以将此观察转化为每行的度量(使用相关的子查询)。其余的就是聚集:

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; 

注:这将很好地工作,足够的少量数据,但它不适合特别好。

+1

很好的答案和梦幻般的解释!我现在可以安然入睡,谢谢! – brainware