Както бе споменато в коментарите, това е класически проблем с пропуските и островите.
Решение, популяризирано от Ицик Бен Ган, е да се използва фактът, че ROW_NUMBER() OVER (ORDER BY number) - number
остава постоянен в рамките на "остров" и не може да се появи в множество острови.
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:Ако number
не е гарантирано, че е уникален замяна на ROW_NUMBER
с DENSE_RANK
в кода по-горе.