Mysql
 sql >> Database >  >> RDS >> Mysql

SQL GROUP BY:intervalli in continuità?

Non esiste tale funzionalità nelle "funzioni standard di SQL", ma è possibile ottenere il set di risultati desiderato utilizzando alcuni trucchi.

Con la sottoquery illustrata di seguito creiamo un campo virtuale che puoi utilizzare per GROUP BY nella query esterna. Il valore di questo campo virtuale viene incrementato ogni volta che si verifica uno spazio vuoto nella sequenza di oID . In questo modo creiamo un identificatore per ciascuna di queste "isole di dati":

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

Tabella di test e generazione dei dati:

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

Devo ringraziare Quassnoi per aver indicato questo trucco in la mia domanda correlata ;-)

AGGIORNAMENTO:aggiunta tabella di test e dati e corretto nome della colonna duplicata nella query di esempio.