Вы не объяснили бизнес-логику, которую пытаетесь реализовать.Следовательно, это решение просто жестко кодирует некоторые правила, основанные на ваших опубликованных данных .
Он использует connect by level
для порождения нескольких строк из одной входной строки (в данном случае это подзапрос на основе двойного) и тестирует level
для условного заполнения столбцов в наборе результатов.
with cte as (
select to_date( '1/7/19', 'MM/DD/YY') as class_start,
to_date( '1/14/19', 'MM/DD/YY') as class_end,
to_date( '1/9/19', 'MM/DD/YY') as enroll_dt,
'early' as reason
from dual
)
select cte.class_start
, case when level = 3 then cte.class_end
end as class_end
, case when level = 1 then cte.class_start
when level = 2 then cte.enroll_dt
else cte.class_end - 1
end as st_dt
, case when level = 1 then cte.enroll_dt - 1
when level = 2 then cte.class_end
else date '9999-12-31'
end as end_dt
, case when level > 1 then cte.enroll_dt end as enroll_dt
, case when level = 3 then cte.reason end as reason
from cte
connect by level <= 3
/
Вероятно, самая большая ошибка будет, если у вас более одной строки ввода.В этом сценарии вам понадобится идентифицированный, чтобы связать порожденные строки вместе.Предположительно в вашей реальной таблице есть какой-то идентификатор.