A observação chave é que uma sequência de números menos outra sequência é uma constante. Podemos gerar outra sequência usando
row_number
. Isso identifica todos os grupos:select id, MIN(number) as low, MAX(number) as high
from (select t.*,
(number - ROW_NUMBER() over (partition by id order by number) ) as groupnum
from t
) t
group by id, groupnum
O resto é apenas agregação.