Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

SQL GROUP BY:intervalos em continuidade?


Não existe essa funcionalidade em "funções padrão do SQL", mas é possível obter o resultado desejado usando alguns truques.

Com a subconsulta ilustrada abaixo, criamos um campo virtual que você pode usar para GROUP BY na consulta externa. O valor deste campo virtual é incrementado cada vez que há uma lacuna na sequência de oID . Desta forma criamos um identificador para cada uma dessas "ilhas de dados":
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

Tabela de teste e geração de dados:
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);

Preciso agradecer a Quassnoi por apontar este truque em minha pergunta relacionada ;-)

ATUALIZAÇÃO:tabela e dados de teste adicionados e nome de coluna duplicado fixo na consulta de exemplo.