Jak wspomniano w komentarzach, jest to klasyczny problem luk i wysp.
Rozwiązaniem spopularyzowanym przez Itzika Ben Gana jest wykorzystanie faktu, że ROW_NUMBER() OVER (ORDER BY number) - number
pozostaje stały w obrębie „wyspy” i nie może pojawiać się na wielu wyspach.
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)
Uwaga:Jeśli number
nie ma gwarancji, że będzie unikalny, zastąp ROW_NUMBER
z DENSE_RANK
w powyższym kodzie.