根据更新列

时间:2017-07-26 13:56:26

标签: sql oracle sas

请帮我解决以下问题:

表AR_X_LO是SCD TYPE 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应该是什么。

1 个答案:

答案 0 :(得分:0)

根据您的要求

  

“一个[...]返回END_TMS应该是什么的SQL查询”

并且由于您指定了SAS标记,因此以下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-passthrough)

注意:符合您提供的预期结果示例,我将END_TMS作为日期返回,即使该变量的名称表明它应该是时间戳(SAS中的日期时间)。