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.