Функция периода не работает должным образом в терадате - PullRequest
0 голосов
/ 28 августа 2018

У меня есть сценарий ниже, где я должен исправить / объединить неправильные записи обработанной истории:

Acct_Id     status_cd   Start_Dttm       End_Dttm    ROLE_CD
1,108,389,774   11     6/10/2009 18:03  7/18/2018 4:11   6
1,108,389,774   11     7/18/2018 4:11   8/8/2018 7:18    6
1,108,389,774   8       8/8/2018 7:18   ?                6

Мне нужно объединить две верхние записи в одну, где история неверна. Я использую запрос ниже.

SELECT acct_id,acct_status_cd,acct_status_start_dttm  ,acct_status_end_dttm ,acct_status_role_cd,run_id, data_source_type_cd,

       BEGIN(PD) AS  acct_status_start_dttm , NULLIF(END(PD), TIMESTAMP '9999-12-31 00:00:00') AS acct_status_end_dttm
    FROM
    ( 
       SELECT NORMALIZE -- 
          acct_id,trim(acct_status_cd) as acct_status_cd ,acct_status_start_dttm  ,acct_status_end_dttm ,acct_status_role_cd,run_id, data_source_type_cd,
          PERIOD(acct_status_start_dttm,COALESCE(acct_status_end_dttm, TIMESTAMP '9999-12-31 00:00:00')) AS PD
       FROM dp_dqmt.acct_stat_hh    
       where acct_status_start_dttm < acct_status_end_dttm  
    ) AS DT

Кто-нибудь может сказать, что здесь не так?

1 Ответ

0 голосов
/ 28 августа 2018

Вам необходимо удалить столбцы даты, поскольку они не совпадают, и поэтому normalize не объединит обе строки:

SELECT acct_id,acct_status_cd
   -- acct_status_start_dttm  ,acct_status_end_dttm ,
     ,acct_status_role_cd,run_id, data_source_type_cd,

       Begin(PD) AS  acct_status_start_dttm , NullIf(End(PD), TIMESTAMP '9999-12-31 00:00:00') AS acct_status_end_dttm
    FROM
    ( 
       SELECT NORMALIZE -- 
          acct_id,Trim(acct_status_cd) AS acct_status_cd ,
          -- acct_status_start_dttm  ,acct_status_end_dttm ,
          acct_status_role_cd,run_id, data_source_type_cd,
          PERIOD(acct_status_start_dttm,Coalesce(acct_status_end_dttm, TIMESTAMP '9999-12-31 00:00:00')) AS PD
       FROM dp_dqmt.acct_stat_hh    
       WHERE acct_status_start_dttm < acct_status_end_dttm  
    ) AS DT

where также удалит последнюю строку с NULL acct_status_end_dttm, если вы не измените ее на

WHERE acct_status_start_dttm < Coalesce(acct_status_end_dttm, TIMESTAMP '9999-12-31 00:00:00') 
...