2012-03-20 49 views
6

想法是說你有下表。SQL GROUP BY:連續性間隔?

------------- 
| oID | Area| 
------------- 
| 1 | 5  | 
| 2 | 2  | 
| 3 | 3  | 
| 5 | 3  | 
| 6 | 4  | 
| 7 | 5  | 
------------- 

如果連續性分組可能這個僞查詢

SELECT SUM(Area) FROM sample_table GROUP BY CONTINUITY(oID) 

將返回

------------- 
| SUM(Area) | 
------------- 
| 10  | 
| 12  | 
------------- 

凡連續性突破出現在OID或者說缺乏代表OID 4項。

這樣的功能是否存在於Sql的標準功能中?

回答

5

「SQL的標準函數」中沒有這樣的功能,但可以通過使用一些技巧來獲得所需的結果集。

通過下面所示的子查詢,我們創建了一個虛擬字段,您可以在外部查詢中使用該虛擬字段來GROUP BY。每當oID的序列中存在間隙時,該虛擬字段的值就會增加。這樣,我們爲每個那些「數據孤島」的標識:

SELECT SUM(Area), COUNT(*) AS Count_Rows 
FROM (
     /* @group_enumerator is incremented each time there is a gap in oIDs continuity */ 
     SELECT @group_enumerator := @group_enumerator + (@prev_oID != oID - 1) AS group_enumerator, 
       @prev_oID := oID AS prev_oID, 
       sample_table.* 
     FROM (
       SELECT @group_enumerator := 0, 
         @prev_oID := -1 
       ) vars, 
       sample_table 
     /* correct order is very important */ 
     ORDER BY 
       oID 
     ) q 
GROUP BY 
     group_enumerator 

測試表和數據生成:

CREATE TABLE sample_table (oID INT auto_increment, Area INT, PRIMARY KEY(oID)); 
INSERT INTO sample_table (oID, Area) VALUES (1,5), (2,2), (3,3), (5,3), (6,4), (7,5); 

我需要感謝Quassnoi您指出this trick in my related question ;-)

更新:在示例查詢中添加了測試表和數據並修復了重複的列名。

0

這是一篇博客文章,提供了與grouping by contiguous data相關的非常詳盡的解釋和示例。如果您有任何理解或實施它的問題,我可以嘗試爲您的問題提供實施。

+0

這也可以不使用臨時表。 – Kaii 2012-03-20 13:28:43