sql >> Base de Datos >  >> RDS >> Sqlserver

¿Cómo encontrar los límites de grupos de números secuenciales contiguos?

Como se menciona en los comentarios, este es un problema clásico de lagunas e islas.

Una solución popularizada por Itzik Ben Gan es utilizar el hecho de que ROW_NUMBER() OVER (ORDER BY number) - number permanece constante dentro de una "isla" y no puede aparecer en varias islas.

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:Si number no se garantiza que sea único reemplazar ROW_NUMBER con DENSE_RANK en el código anterior.