Come accennato nei commenti questo è un classico problema di lacune e isole.
Una soluzione resa popolare da Itzik Ben Gan consiste nell'usare il fatto che ROW_NUMBER() OVER (ORDER BY number) - number
rimane costante all'interno di un'"isola" e non può apparire in più isole.
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
non è garantito che sia univoco sostituire ROW_NUMBER
con DENSE_RANK
nel codice sopra.