2012-02-07 99 views
5

我試圖獲得每個子序列的行數。選擇連續記錄的數量

最初的表看起來是這樣的:

+----+-------------+ 
| id | value  | 
+----+-------------+ 
| 1 | a   | 
| 2 | b   | 
| 3 | b   | 
| 4 | c   | 
| 5 | a   | 
| 6 | a   | 
| 7 | a   | 
| 8 | a   | 
| 9 | c   | 
| 10| c   | 
+----+-------------+ 

查詢應返回的項目數的值的每個序列:

+----+-------------+ 
| value | count | 
+----+-------------+ 
| a | 1  | 
| b | 2  | 
| c | 1  | 
| a | 4  | 
| c | 2  | 
+-------+----------+ 

到目前爲止,我一直沒能來提供解決方案,至少對於大型桌子來說不夠快。理想情況下,會有一個「group by」聲明,它不會混淆記錄的順序。

+2

這被稱爲遊程長度編碼。 – 2012-02-07 11:11:44

+0

重複的http://stackoverflow.com/questions/9172006/how-to-combine-near-same-item-by-sql – flesk 2012-02-07 11:18:02

回答

2
SELECT value, count(*) FROM (
    SELECT value, 
    (CASE WHEN @v != value THEN @i:[email protected]+1 ELSE @i END) gid, 
    @v := value FROM myTable, (SELECT @v:='', @i := 0) vars 
) tbl 
GROUP BY gid 
+0

我認爲這是非常關閉...只有一件事。在第一個記錄之後的每個記錄的變化中,@i將是開始下一個循環的計數。我會將您的ELSE更改爲ELSE @i:= 1 ...以表示它正在重置爲1,作爲剛剛進入的新ID的開始。 – DRapp 2012-02-13 14:23:34

+0

@DRapp:你試過了嗎?我認爲它按照OP的要求是正常的,而且你的建議會打破它。你需要一個不斷增加的計數器,否則你將把相同的值組合在一起,這些值由不同的值組分開。 – flesk 2012-02-13 14:40:36

+0

你是對的......錯過了它,你的COUNT是真正的計數器,你的「i」值是每個值之間的週期性變化之間的力量中斷......誤解了你的「i」變量 – DRapp 2012-02-13 15:39:58