Историческая таблица с датой начала и окончания и поворотом - PullRequest
0 голосов
/ 06 февраля 2019

У меня есть хронологическая таблица.

Условия:

min дата от date_asgn, чтобы начать цикл завершения start_cycle за секунду до следующей даты.Нужна только последняя дата в этот день, не имеет значения, под какой ролью он находится.

PKID    ID   CUSTID  ROLE      Date_ASGN
 1      45    4565   Primary   12/20/2018 3:12:24 PM
 2      45    4025   Secondary 12/20/2018 3:12:24 PM
 3      45    594    Primary   1/2/2019 4:09:58 PM

Мой ожидаемый вывод:

ID START_CYCLE          END_CYCLE          PRIMARY  SECONDARY  BACKUP
45  12/20/2018 3:12:24  1/2/2019 4:09:57   4565       4025      NULL
45  1/2/2019   4:09:58  12/31/9999         594        4025      NULL

Мой текущий SQL.

SELECT
A.ID,
A.DATE_ASGN AS START_CYCLE,
CASE WHEN LEAD (A.DATE_ASGN ) OVER (PARTITION BY A.ID ORDER BY A.DATE_ASGN ) = TRUNC(A.DATE_ASGN ) THEN NULL 
ELSE LEAD (A.DATE_ASGN ) OVER (PARTITION BY A.ID ORDER BY A.DATE_ASGN ) - NUMTODSINTERVAL(1,'second')
END AS END_CYCLE,
'' AS [PRIMARY],
'' AS SECONDARY
'' AS [BACKUP]

FROM (SELECT * FROM (SELECT H.*,DENSE_RANK() OVER (PARTITION BY ID,TRUNC(H.DATE_ASGN) ORDER BY H.DATE_ASGN DESC,PK DESC) RNK
  FROM  H
  WHERE H.ID = 45
                          )
                          WHERE RNK = 1) A

Вывод:

 ID  START_CYCLE            END_CYCLE           PRIMARY  SECONDARY  BACKUP
 45   12/20/2018 3:12:24 PM 1/2/2019 4:09:57 PM  
 45   1/2/2019 4:09:58      12/31/9999

Какие другие шаги необходимычтобы получить ожидаемый результат.Я думал о том, чтобы превратить мой SQL в CTE и работать оттуда, но не знал, с чего начать.

Ответы [ 2 ]

0 голосов
/ 06 февраля 2019

Вы просто хотите агрегировать по id и части даты date_asn?

select id, min(date_asn) as start_cycle, max(date_asn) as end_cycle,
       max(case when role = 'Primary' then custid end) as primary,
       max(case when role = 'Secondary' then custid end) as secondary,
       max(case when role = 'Backup' then custid end) as backup
from t
group by id, trunc(date_asn);

Если вы хотите заполнить secondary самой последней не NULL вторичной:

select id, min(date_asn) as start_cycle, max(date_asn) as end_cycle,
       max(case when role = 'Primary' then custid end) as primary,
       lag(max(case when role = 'Secondary' then custid end) ignore nulls) over (partition by id order by min(date_asn)) as secondary,
       max(case when role = 'Backup' then custid end) as backup
from t
group by id, trunc(date_asn);
0 голосов
/ 06 февраля 2019

У вас уже есть элементы решения.Таким образом, у вас не должно быть особых проблем с пониманием кода ниже.Пожалуйста, задавайте дополнительные вопросы по мере необходимости.

Обратите внимание на промежуточный шаг, 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   
...