Comme mentionné dans les commentaires, il s'agit d'un problème classique de lacunes et d'îles.
Une solution popularisée par Itzik Ben Gan consiste à utiliser le fait que ROW_NUMBER() OVER (ORDER BY number) - number
reste constant dans une "île" et ne peut pas apparaître dans plusieurs îles.
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
n'est pas garanti d'être unique remplacez ROW_NUMBER
avec DENSE_RANK
dans le code ci-dessus.