Вы можете использовать функцию LAG()
, чтобы назначить группу по номеру для каждого значения. Тогда группировка будет простой.
Например:
with
a as (
select val,
case when lag(val) over(order by val) = val - 1 then 0 else 1 end as adjacent
from sequence
),
b as (
select val,
sum(adjacent) over(order by val) as grp
from a
)
select min(val) as range_start, max(val) as range_end
from b
group by grp
Результат:
RANGE_START RANGE_END
----------- ---------
1 3
5 5
8 10
Для справки, я использовал скрипт данных:
create table sequence (val number(6));
insert into sequence (val) values (1);
insert into sequence (val) values (2);
insert into sequence (val) values (3);
insert into sequence (val) values (5);
insert into sequence (val) values (8);
insert into sequence (val) values (9);
insert into sequence (val) values (10);
Дополнительное примечание : sequence
- это действительно плохое имя для таблицы. Некоторые инструменты могут запутаться этим. Иногда вам придется заключать его в двойные кавычки по всему месту.