У вас уже есть элементы решения.Таким образом, у вас не должно быть особых проблем с пониманием кода ниже.Пожалуйста, задавайте дополнительные вопросы по мере необходимости.
Обратите внимание на промежуточный шаг, CTE, который я назвал p
- нам нужно избавиться от ненужных столбцов, когда мы используем оператор pivot
(в данном случае, столбец PKID
), и я добавляю ваш дополнительный фильтр where id = 45
в этот промежуточный шаг.
with
h (pkid, id, custid, role, date_asgn) as (
select 1, 45, 4565, 'Primary' , to_date('12/20/2018 3:12:24 PM'
, 'mm/dd/yyyy hh:mi:ss AM') from dual union all
select 2, 45, 4025, 'Secondary', to_date('12/20/2018 3:12:24 PM'
, 'mm/dd/yyyy hh:mi:ss AM') from dual union all
select 3, 45, 594, 'Primary' , to_date('1/2/2019 4:09:58 PM '
, 'mm/dd/yyyy hh:mi:ss AM') from dual
)
, p as (select id, custid, role, date_asgn from h where id = 45)
select id, date_asgn as start_cycle,
lead(date_asgn, 1, date '9999-12-31') over (order by date_asgn) end_cycle,
last_value(primary ignore nulls) over (order by date_asgn) primary,
last_value(secondary ignore nulls) over (order by date_asgn) secondary,
last_value(backup ignore nulls) over (order by date_asgn) backup
from p
pivot (max(custid) for role in ('Primary' primary, 'Secondary' secondary,
'Backup' backup))
;
ID START_CYCLE END_CYCLE PRIMARY SECONDARY BACKUP
-- ---------------------- ---------------------- ---------- ---------- ----------
45 12/20/2018 03:12:24 PM 01/02/2019 04:09:58 PM 4565 4025
45 01/02/2019 04:09:58 PM 12/31/9999 12:00:00 AM 594 4025