sql >> Databáze >  >> RDS >> Mysql

SQL GROUP BY:intervaly v kontinuitě?

Ve "standardních funkcích SQL" žádná taková funkce není, ale pomocí některých triků je možné získat požadovanou sadu výsledků.

Pomocí níže uvedeného dílčího dotazu vytvoříme virtuální pole, které můžete použít k GROUP BY ve vnějším dotazu. Hodnota tohoto virtuálního pole se zvýší pokaždé, když je mezera v sekvenci oID . Tímto způsobem vytvoříme identifikátor pro každý z těchto „datových ostrovů“:

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

Testovací tabulka a generování dat:

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

Musím poděkovat Quassnoi za upozornění na tento trik v můj související dotaz ;-)

UPDATE:přidána testovací tabulka a data a opraven duplicitní název sloupce v příkladu dotazu.



  1. php a html formulář na stejné stránce

  2. Funkce RTRIM() v Oracle

  3. Jak přidám primární klíč auto_increment do databáze SQL Server?

  4. Dokumentace Oracle