【发布时间】:2019-12-07 15:05:01
【问题描述】:
我有一个地址 SCD 类型 2 表,但有时输入的信息保持不变我想编写一个查询,如果信息不变,保留以前的开始数据并将结束日期设置为最大值,例如
OBJID BEGDA ENDDA HASHROW_COL RK
83022088 2012-03-30 2012-10-28 e1-ef-a9-36 1
83022088 2012-10-29 2013-09-07 63-69-e5-25 2
83022088 2013-09-08 2014-08-30 e1-ef-a9-36 3
83022088 2014-08-31 2016-11-26 e1-ef-a9-36 4
83022088 2016-11-27 9999-12-31 e1-ef-a9-36 5
请注意,从第 3 行到第 5 行,HASHROW_COL 保持不变。
Desired result:
OBJID BEGDA ENDDA HASHROW_COL RK
83022088 2012-03-30 2012-10-28 e1-ef-a9-36 1
83022088 2012-10-29 2013-09-07 63-69-e5-25 2
83022088 2013-09-08 9999-12-31 e1-ef-a9-36 3
查询至今
select a.objid, a.hashrow_col,
case when a.objid <> b.objid then b.begda
when a.hashrow_col = b.hashrow_col and (b.begda - interval '1' day <= a.endda) then
a.begda end,
case when a.objid <> b.objid then b.endda
when (a.hashrow_col = b.hashrow_col) and (b.begda - interval '1' day <= a.endda) and b.endda > a.endda
then b.endda
end,
from
(select objid, begda, endda, HASHROW_COL,
from OTABLE ) a
inner join
(select objid, begda, endda, HASHROW_COL,
from OTABLE) b
on
a.objid = b.objid
where
and a.objid = '83022088'
order by a.OBJID, a.BEGDA, a.HASHROW_COL;
【问题讨论】:
-
HASHROW_COL&RK是计算列吗(为了简化逻辑)?您是要修复 SCD 表中的数据还是选择那些规范化的行?那么大概就是一个简单的select normalize
标签: sql inner-join teradata row-number scd