L'observation clé est qu'une séquence de nombres moins une autre séquence est une constante. Nous pouvons générer une autre séquence en utilisant row_number
. Ceci identifie tous les groupes :
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
Le reste n'est que de l'agrégation.