De belangrijkste observatie is dat een reeks getallen minus een andere reeks een constante is. We kunnen een andere reeks genereren met behulp van row_number
. Dit identificeert alle groepen:
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
De rest is gewoon aggregatie.