Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Como encontrar os limites de grupos de números sequenciais contíguos?


Como mencionado nos comentários, este é um problema clássico de lacunas e ilhas.

Uma solução popularizada por Itzik Ben Gan é usar o fato de que ROW_NUMBER() OVER (ORDER BY number) - number permanece constante dentro de uma "ilha" e não pode aparecer em várias ilhas.
WITH T
     AS (SELECT ROW_NUMBER() OVER (ORDER BY number) - number AS Grp,
                number
         FROM   mytable
         WHERE  status = 0)
SELECT MIN(number) AS [From],
       MAX(number) AS [To]
FROM   T
GROUP  BY Grp
ORDER  BY MIN(number) 

NB:Se number não é garantido que seja exclusivo substitua ROW_NUMBER com DENSE_RANK no código acima.