Самый простой способ сделать это, чтобы сравнить дату окончания строки с датой начала следующего. Вы можете сделать это легко, используя аналитическую функцию LEAD, например:
with abc as (select 1 emp_no, to_date('01/01/2010', 'dd/mm/yyyy') eff_start_date, to_date('28/03/2010', 'dd/mm/yyyy') eff_end_date, 'XYZ' org, 'SMITH' name, to_date('10/01/1990', 'dd/mm/yyyy') dob, 'SINGLE' status from dual union all
select 1 emp_no, to_date('29/03/2010', 'dd/mm/yyyy') eff_start_date, to_date('29/08/2010', 'dd/mm/yyyy') eff_end_date, 'XYZ' org, 'SMITH' name, to_date('10/01/1990', 'dd/mm/yyyy') dob, 'MARRIED' status from dual union all
select 1 emp_no, to_date('20/10/2010', 'dd/mm/yyyy') eff_start_date, to_date('31/12/4712', 'dd/mm/yyyy') eff_end_date, 'XYZ' org, 'SMITH' name, to_date('10/01/1990', 'dd/mm/yyyy') dob, 'DIVORCEE' status from dual union all
select 2 emp_no, to_date('04/02/2010', 'dd/mm/yyyy') eff_start_date, to_date('28/03/2010', 'dd/mm/yyyy') eff_end_date, 'XYZ' org, 'JOHN' name, to_date('10/01/1990', 'dd/mm/yyyy') dob, 'SINGLE' status from dual union all
select 2 emp_no, to_date('29/03/2010', 'dd/mm/yyyy') eff_start_date, to_date('31/12/4712', 'dd/mm/yyyy') eff_end_date, 'XYZ' org, 'JOHN' name, to_date('10/01/1990', 'dd/mm/yyyy') dob, 'MARRIED' status from dual union all
select 3 emp_no, to_date('02/02/2010', 'dd/mm/yyyy') eff_start_date, to_date('21/03/2010', 'dd/mm/yyyy') eff_end_date, 'XYZ' org, 'GEETA' name, to_date('10/01/1990', 'dd/mm/yyyy') dob, 'SINGLE' status from dual union all
select 3 emp_no, to_date('29/03/2010', 'dd/mm/yyyy') eff_start_date, to_date('31/12/4712', 'dd/mm/yyyy') eff_end_date, 'XYZ' org, 'GEETA' name, to_date('10/01/1990', 'dd/mm/yyyy') dob, 'MARRIED' status from dual)
-- end of mimicking your abc table; you won't need the above subquery, as you already have a table called abc.
select emp_no,
eff_end_date + 1 gap_start_date,
next_eff_start_date - 1 gap_end_date,
org,
name,
'UKNOWN' status
from (select emp_no,
eff_start_date,
eff_end_date,
lead(eff_start_date) over (partition by emp_no order by eff_start_date) next_eff_start_date,
org,
name,
dob,
status
from abc)
where next_eff_start_date - eff_end_date > 1;
EMP_NO GAP_START_DATE GAP_END_DATE ORG NAME STATUS
---------- -------------- ------------ --- ----- ------
1 30-AUG-2010 19-OCT-2010 XYZ SMITH UKNOWN
3 22-MAR-2010 28-MAR-2010 XYZ GEETA UKNOWN
N.B. Вы не сказали, какой результат вы ожидали увидеть, поэтому я дал вам даты начала и окончания разрыва.
Кроме того, как и Lalit, я использовал подзапрос в предложении WITH для генерации выборочных данных. Вам не нужен этот подзапрос, поскольку у вас уже есть таблица «abc».
См. [** Пробелы и острова **] (https://lalitkumarb.com/category/gaps-and-islands/) –
@ LalitKumarB- Пример, который вы указали. \t У меня есть таблица с пояснениями работника 13k с эффективной датой начала и датой окончания, как указано выше ... Сценарий, который вы дали, должен будет рассмотреть только несколько дат с заявлением ..... Я хочу больше общее решение –
@Lyka Итак? Я не ОП, я не задавал вопрос. Я думаю, вы хотели предоставить эту ссылку на OP, а не мне. Кроме того, решение в предоставленной вами ссылке относится к 'sql-server', а не' oracle'. –