Предполагая, что эта структура таблицы:
create table test (
log_id number(5) primary key,
employee_id number(5) not null
)
Этот пример данных:
insert into test
(select 12342, 99999 from dual union all
select 12343, 77777 from dual union all
select 12344, 99999 from dual union all
select 12345, 99999 from dual union all
select 12346, 99999 from dual union all
select 12347, 88888 from dual union all
-- gap
select 12357, 88888 from dual union all
select 12358, 33333 from dual union all
select 12359, 33333 from dual
)
Вы можете сделать это с помощью этого запроса:
with x as (
select log_id,
employee_id,
lead(log_id) over (order by log_id) as next_log_id,
lag(log_id) over (order by log_id) as previous_log_id,
lead(employee_id) over (order by log_id) as next_employee_id,
lag(employee_id) over (order by log_id) as previous_employee_id
from test
)
select log_id, employee_id
from x
where (log_id = next_log_id - 1 and employee_id = next_employee_id)
or (log_id = previous_log_id + 1 and employee_id = previous_employee_id)
order by 1
С этим результатом:
LOG_ID | EMPLOYEE_ID
-------+------------
12344 | 99999
12345 | 99999
12346 | 99999
12358 | 33333
12359 | 33333
Если вам гарантировано, что последовательность значений LOG_ID
без пропусков (поскольку выборка находится в диапазоне от 12342 до 12347), вы можете использовать более простой вариант:
with x as (
select log_id,
employee_id,
lead(employee_id) over (order by log_id) as next_employee_id,
lag(employee_id) over (order by log_id) as previous_employee_id
from test
where log_id between 12342 and 12347
)
select log_id, employee_id
from x
where employee_id in (previous_employee_id, next_employee_id)
order by 1
Вы можете увидеть его в действии на этом Oracle LiveSQL или SQL Fiddle .