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

SQL GROUP BY:intervaller i kontinuitet?

Der er ingen sådan funktionalitet i "standardfunktioner i SQL", men det er muligt at få det ønskede resultat sat ved at bruge nogle tricks.

Med underforespørgslen, der er illustreret nedenfor, opretter vi et virtuelt felt, som du kan bruge til at GROUP BY i den ydre forespørgsel. Værdien af ​​dette virtuelle felt øges hver gang, når der er et hul i sekvensen oID . På denne måde opretter vi en identifikator for hver af disse "dataøer":

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

Jeg er nødt til at takke Quassnoi for at have påpeget dette trick i mit relaterede spørgsmål ;-)

OPDATERING:tilføjet testtabel og data og fikset duplikatkolonnenavn i eksempelforespørgsel.



  1. 'SQLSTATE[HY093]:Ugyldigt parameternummer:antallet af bundne variable matcher ikke antallet af tokens'

  2. En SaaS abonnementsdatamodel

  3. MYSQL:COUNT med GROUP BY, LEFT JOIN og WHERE-sætning returnerer ikke nulværdier

  4. Sådan annoteres MYSQL autoincrement-felt med JPA-annoteringer