Всякий раз, когда секция или двигатель изменяют, отмечают строку с флагом 1, иначе 0.
case when lag(carrying_engine) over (order by area) = carrying_engine
and lag(section) over (order by area) = section
then 0 else 1 end as flag
Затем суммируйте эти флаги по порядку.
sum(flag) over (order by a) grp
Это назначит каждую строку группе. Теперь легко, найдите минимальную область и минимальную область из следующего ряда.
min(a) a1, lead(min(a)) over (order by grp) a2
Вы можете удалить последний ряд, который вам не нужен, используя
where a2 is not null
Вместе:
with
groups as (
select a, s, e, sum(flag) over (order by a) grp
from (
select area a, Section s, Carrying_Engine e,
case when lag(carrying_engine) over (order by area) = carrying_engine
and lag(section) over (order by area) = section
then 0 else 1 end as flag
from engines))
select *
from (
select s, e, grp, min(a) a1, lead(min(a)) over (order by grp) a2
from groups group by s, e, grp )
where a2 is not null
order by grp
dbfiddle
Я использовал area
, чтобы определить порядок строк, потому что это все, что вы указали, но если Ваша таблица содержит другой идентификатор, используйте его в order by
предложениях.