2016-01-04 38 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