Это проблема пробелов и островов. Вы хотите сгруппировать смежные строки, где rnk
имеет значение 1
.
Вот подход, использующий row_number()
и условные выражения:
select
case when min(id) <> max(id) then concat(min(id), '-', max(id)) else min(id) end id,
min(rnk) rnk
from (
select
t.*,
row_number() over(order by id) rn1,
row_number() over(partition by rnk order by id) rn2
from mytable t
) t
group by case when rnk = 1 then rn1 - rn2 else rn1 + rn2 end
order by min(id)
Демонстрация по БД Fiddle :
id | rnk
:-------- | --:
A100-A102 | 1
A103 | 0
A104 | 0
A105-A106 | 1