Проблемы с пробелами и островами - это весело, потому что есть много разных способов их решения. Вот один подход, который не требует агрегирования - хотя он требует более широкого использования оконных функций.
Это возможно, потому что единственная запрашиваемая вами информация - это счетчик. Если id
не имеет пробелов и является последовательным:
select num,
lead(id, 1, max_id + 1) over (order by id) - id
from (select t.*,
lag(num) over (order by id) as prev_num,
max(id) over () as max_id
from temp t
) t
where prev_num is null or prev_num <> num
order by id;
В противном случае вы можете легко сгенерировать такую последовательность:
select num,
lead(seqnum, 1, cnt + 1) over (order by id) - seqnum
from (select t.*,
lag(num) over (order by id) as prev_num,
row_number() over (order by id) as seqnum,
count(*) over () as cnt
from temp t
) t
where prev_num is null or prev_num <> num
order by id;
Здесь - это дБ. <> скрипка.