Mysql
 sql >> Datenbank >  >> RDS >> Mysql

SQL GROUP BY:Intervalle in Kontinuität?

Eine solche Funktionalität gibt es in "Standardfunktionen von SQL" nicht, aber es ist möglich, mit einigen Tricks die gewünschte Ergebnismenge zu erhalten.

Mit der unten abgebildeten Unterabfrage erstellen wir ein virtuelles Feld, das Sie zum GROUP BY verwenden können in der äußeren Abfrage. Der Wert dieses virtuellen Feldes wird jedes Mal erhöht, wenn es eine Lücke in der Folge von oID gibt . Auf diese Weise erstellen wir eine Kennung für jede dieser „Dateninseln“:

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

Testtabelle und Datengenerierung:

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);

Ich muss Quassnoi dafür danken, dass er auf diesen Trick hingewiesen hat meine verwandte Frage ;-)

UPDATE:Testtabelle und Daten hinzugefügt und doppelter Spaltenname in Beispielabfrage behoben.