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.