「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 ;-)
更新:在示例查詢中添加了測試表和數據並修復了重複的列名。
這也可以不使用臨時表。 – Kaii 2012-03-20 13:28:43