sql >> Base de Datos >  >> RDS >> Mysql

SQL GROUP BY:¿intervalos en continuidad?

No existe tal funcionalidad en las "funciones estándar de SQL", pero es posible obtener el conjunto de resultados deseado utilizando algunos trucos.

Con la subconsulta que se ilustra a continuación, creamos un campo virtual que puede usar para GROUP BY en la consulta externa. El valor de este campo virtual se incrementa cada vez que hay un espacio en la secuencia de oID . De esta manera creamos un identificador para cada una de esas "islas de datos":

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

Tabla de prueba y generación de datos:

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

Necesito agradecer a Quassnoi por señalar este truco en mi pregunta relacionada ;-)

ACTUALIZACIÓN:se agregaron datos y tabla de prueba y se corrigió el nombre de la columna duplicada en la consulta de ejemplo.