Ниже приведены структура таблицы и данные
ВХОД:
S_ID PREV_STD NEXT_STD CHG_DT
------------------------------------------
1 3 4 23-NOV-16
1 4 5 20-NOV-17
1 5 6 17-NOV-18
2 3 4 20-NOV-17
3 3 4 23-NOV-16
Я хочу преобразовать приведенное ниже: 09-DEC-18 - это системная дата, 01-JAN-00дата начала первого стандартного экзамена для каждого студента.
Желаемый результат:
S_ID PREV_STD NEXT_STD START_DT END_DT
--------------------------------------------------
1 3 4 01-JAN-00 22-NOV-16
1 4 5 23-NOV-16 19-NOV-17
1 5 6 20-NOV-17 16-NOV-18
1 6 6 17-NOV-18 09-DEC-18
2 3 4 01-JAN-00 19-NOV-17
2 4 4 20-NOV-17 09-DEC-18
3 3 4 01-JAN-00 22-NOV-16
3 4 4 23-NOV-16 09-DEC-18
Моя попытка (в процессе):
with input as
(
select 1 s_id, 3 prev_std, 4 next_std, to_date('20161123', 'YYYYMMDD') chg_dt
from dual
union all
select 1 s_id, 4, 5, to_date('20171120', 'YYYYMMDD')
from dual
union all
select 1 s_id, 5, 6, to_date('20181117', 'YYYYMMDD')
from dual
union all
select 2 s_id, 3, 4, to_date('20171120', 'YYYYMMDD')
from dual
union all
select 3 s_id, 3, 4, to_date('20161123', 'YYYYMMDD')
from dual
)
select
S_ID, PREV_STD, NEXT_STD,
NVL(lag(CHG_DT) over(partition by s_id order by chg_dt),
to_date('20000101','YYYYMMDD')) start_dt,
CHG_DT - 1 stop_dt,
CHG_DT,
NVL(lead(CHG_DT) over(partition by s_id order by chg_dt), sysdate) next_start_dt,
count(1) over(partition by s_id order by chg_dt) rec_num,
count(1) over(partition by s_id) rec_to_process
from
input;