sql >> Databasteknik >  >> RDS >> Mysql

SQL GROUP BY:intervaller i kontinuitet?

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.



  1. Är MySQL mer resistent mot SQL-injektionsattack än PostgreSQL (under Perl/DBI)?

  2. Hur grupperar man arraydata som returneras av left join-fråga i php?

  3. Fråga för att kontrollera tabellstorleken i Oracle-databasen

  4. Kan en INNER JOIN erbjuda bättre prestanda än FINNS