Вы можете сделать это без pl / sql, используя запрос с некоторыми распространенными табличными выражениями (предложение with
).Это выглядело бы так:
with add_break as (
select part_no,
serial_no,
serial_no-1-lag(serial_no,1,0) over (partition by part_no order by serial_no) brk
from part_tab
),
add_group as (
select add_break.*,
sum(brk) over (partition by part_no order by serial_no) as grp
from add_break
)
select part_no,
case when min(serial_no) = max(serial_no) then to_char(min(serial_no))
else to_char(min(serial_no)) || '-' || to_char(max(serial_no))
end range
from add_group
group by part_no, grp
order by 1, 2
Вывод данных для вашего примера:
part_no | range
--------+------
A | 1-3
A | 5
A | 7-10