Det finns ingen sådan funktionalitet i "standardfunktioner i SQL", men det är möjligt att få önskat resultat genom att använda några knep.
Med underfrågan som illustreras nedan skapar vi ett virtuellt fält som du kan använda för att GROUP BY
i den yttre frågan. Värdet på detta virtuella fält ökas varje gång det finns en lucka i sekvensen oID
. På så sätt skapar vi en identifierare för var och en av dessa "dataöar":
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
Testtabell och datagenerering:
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);
Jag måste tacka Quassnoi för att han påpekade det här tricket i min relaterade fråga ;-)
UPPDATERING:lade till testtabell och data och fixade dubblettkolumnnamn i exempelfrågan.