Você deseja identificar grupos de valores adjacentes. Um método é usar
lag()
para encontrar o início da sequência e, em seguida, uma soma cumulativa para identificar os grupos. Outro método é a diferença do número da linha:
select value, min(id) as from_id, max(id) as to_id
from (select t.*,
(row_number() over (order by id) -
row_number() over (partition by val order by id
) as grp
from table t
) t
group by grp, value;