sql >> Database >  >> RDS >> Mysql

SQL GROUP BY:intervallen in continuïteit?

Er is geen dergelijke functionaliteit in "standaardfuncties van SQL", maar het is mogelijk om het gewenste resultaat te krijgen door enkele trucs te gebruiken.

Met de hieronder geïllustreerde subquery creëren we een virtueel veld dat u kunt gebruiken om GROUP BY in de buitenste vraag. De waarde van dit virtuele veld wordt elke keer verhoogd wanneer er een hiaat is in de reeks van oID . Op deze manier creëren we een identifier voor elk van die "data-eilanden":

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

Testtabel en gegevensgeneratie:

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

Ik moet Quassnoi bedanken voor het wijzen op deze truc in mijn gerelateerde vraag ;-)

UPDATE:testtabel en gegevens toegevoegd en vaste dubbele kolomnaam in voorbeeldquery.



  1. MYSQL:Waar clausule dubbelzinnig is

  2. MySQL-query IN()-clausule traag op geïndexeerde kolom

  3. Hoe voorkom je dat deze zoekopdracht twee keer dezelfde resultaten afdrukt?

  4. SQLite - Maak een relatie