Jak bylo zmíněno v komentářích, jedná se o klasický problém s mezerami a ostrovy.
Řešením, které zpopularizoval Itzik Ben Gan, je použití skutečnosti, že ROW_NUMBER() OVER (ORDER BY number) - number
zůstává konstantní v rámci „ostrova“ a nemůže se objevit na více ostrovech.
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)
Poznámka:Pokud number
není zaručeno, že je jedinečný, nahraďte ROW_NUMBER
s DENSE_RANK
v kódu výše.