2017-07-26 87 views
-1

請幫我下面:更新列基於

表AR_X_LO是一個SCD類型2表。 ETL中存在一個錯誤,其結果是改變的記錄還沒有結束日期,例如,

AR_X_LO_TP_ID AR_ID EFF_TMS   LO_ID RANK END_TMS ORIG_SRC_STM_ID RT_TMS 
------------- ------- ------------------- -------- ---- ---------- --------------- ----------      
802   6751231 2016-06-08 00:00:00 39748325 1 NULL  9643   2016-06-09    
802   6751231 2015-05-02 00:00:00 29496916 1 NULL  9643   2015-05-04    

ETL應該以新行的EFF_TMS結束更改的行 - 1天。

AR_X_LO_TP_ID AR_ID EFF_TMS   LO_ID RANK END_TMS ORIG_SRC_STM_ID RT_TMS 
------------- ------- ------------------- -------- ---- ---------- --------------- ----------      
802   6751231 2016-06-08   39748325 1 NULL    9643 2016-06-09    
802   6751231 2015-05-02   29496916 1 2016-06-07   9643 2015-05-04 

我想寫一個SQL查詢,對於每個AR_ID,AR_X_LO_TP_ID,RANK,ORIG_SRC_STM_ID組合返回什麼END_TMS應該是。

+0

你只想要一個查詢(SELECT?)還是一個更新? – APC

+0

請解釋爲什麼sas和oracle被標記。您是否運行連接到Oracle數據庫後端的SAS程序?你需要一個'proc sql'解決方案嗎? – Parfait

+0

請發佈您迄今爲止所嘗試的內容。另外,根據'錯誤',也許你可以在過程中修復它。 – Reeza

回答

0

根據您的要求是對

,因爲你指定的SAS標籤「的SQL查詢[...]返回什麼END_TMS應該是」

,並在下面SAS代碼將做到這一點:

proc sql; 
create table result as 
select t1.*, datepart(t2.EFF_TMS)-1 as END_TMS format=E8601DA. 
from AR_X_LO(drop=END_TMS) t1 
left join AR_X_LO t2 
    on t1.AR_ID = t2.AR_ID 
    and t1.AR_X_LO_TP_ID = t2.AR_X_LO_TP_ID 
    and t1.RANK= t2.RANK 
    and t1.ORIG_SRC_STM_ID = t2.ORIG_SRC_STM_ID 
    and t1.EFF_TMS < t2.EFF_TMS 
group by t1.EFF_TMS 
having END_TMS=min(END_TMS) 
; 
quit; 

注意,這個代碼包含SAS特定的語句/功能(如datepart()功能,format=語句或drop=數據集選項),在其他SQL環境(如您也標記爲Oracle的環境)中不起作用,並且如果您確實在Oracle後端工作,則在SAS中執行效果會很差。 如果是後者,你也許可以做到這一點更優雅與分析功能,如lagleadpartition by等(使用中當SAS SQL-直通)

注:符合您所提供的預期結果的例子,我將END_TMS作爲日期返回,即使該變量的名稱顯示它應該可能由時間戳記(SAS中的datetime)。