Mysql
 sql >> Base de données >  >> RDS >> Mysql

SQL GROUP BY :intervalles dans la continuité ?

Il n'y a pas une telle fonctionnalité dans les "fonctions standard de SQL", mais il est possible d'obtenir le jeu de résultats souhaité en utilisant quelques astuces.

Avec la sous-requête illustrée ci-dessous, nous créons un champ virtuel que vous pouvez utiliser pour GROUP BY dans la requête externe. La valeur de ce champ virtuel est incrémentée à chaque fois qu'il y a un trou dans la séquence de oID . De cette façon, nous créons un identifiant pour chacun de ces "îlots de données":

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

Table de test et génération de données :

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

Je dois remercier Quassnoi d'avoir signalé cette astuce dans ma question connexe ;-)

MISE À JOUR :table et données de test ajoutées et nom de colonne en double fixe dans l'exemple de requête.