簡體   English   中英

SQL GROUP BY:連續性的間隔?

[英]SQL GROUP BY: intervals in continuity?

這個想法就是說你有下表。

-------------
| 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的標准功能中?

“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 在我的相關問題中指出這個技巧 ;-)

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

這是一篇博客文章,提供了一個非常詳盡的解釋和與連續數據分組相關的示例。 如果您有任何理解或實現它,我可以嘗試為您的問題提供實現。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM