请帮我解决以下问题:
表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应该是什么。
答案 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中表现不佳。
如果后者是真的,你可以使用lag
,lead
,partition by
等分析函数更优雅地做到这一点(在SAS中使用SQL-passthrough)
注意:符合您提供的预期结果示例,我将END_TMS作为日期返回,即使该变量的名称表明它应该是时间戳(SAS中的日期时间)。