Не уверен, что я понял ваши требования, но давайте попробуем:
select emp_no, from_date, to_date, level lvl,
connect_by_root(from_date) initial_date
from tbl t1
start with
not exists (
select 1
from tbl t2
where t1.emp_no = t2.emp_no and t1.from_date = t2.to_date + 1)
connect by emp_no = prior emp_no and from_date = prior to_date + 1
dbfiddle demo
Используя эти примеры данных:
with tbl(emp_no, from_date, to_date) as (
select 234, date '2018-12-01', date '2018-12-10' from dual union all
select 234, date '2018-12-11', date '2019-01-05' from dual union all
select 234, date '2019-01-06', date '2019-01-20' from dual union all
select 234, date '2019-01-21', date '2019-01-25' from dual union all
-- not continuous dates
select 234, date '2019-03-10', date '2019-03-17' from dual union all
select 234, date '2019-03-18', date '2019-03-25' from dual union all
-- other emp_no
select 407, date '2018-12-15', date '2019-01-07' from dual )
... мы получим этот результат:
EMP_NO FROM_DATE TO_DATE LVL INITIAL_DATE
------ ----------- ----------- ---------- ------------
234 2018-12-01 2018-12-10 1 2018-12-01
234 2018-12-11 2019-01-05 2 2018-12-01
234 2019-01-06 2019-01-20 3 2018-12-01
234 2019-01-21 2019-01-25 4 2018-12-01
234 2019-03-10 2019-03-17 1 2019-03-10
234 2019-03-18 2019-03-25 2 2019-03-10
407 2018-12-15 2019-01-07 1 2018-12-15
Если это не то, что вам нужно, отредактируйте ваш вопрос и покажите требуемый результат, соответствующий более сложному образцуданные (например, мой пример выше).
Объяснение: Иерархический запрос (connect by
) находит для каждых emp_no
дат, которые не являются непрерывными, и начиная с этих точек, присоединяются следующие непрерывные строки.Оператор connect_by_root
используется для представления initial_date
.