如果结果保持不变,如何获取最小日期和最大日期

问题描述 投票:0回答:2

我有一个地址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;
sql inner-join teradata row-number scd
2个回答
0
投票
这是一个孤岛问题。在这种情况下,我将使用:

select objid, min(begda), max(endda), HASHROW_COL, row_number() over (partition by objid order by min(begda)) as ranking from (select t.*, sum(case when prev_endda = begda - interval '1' day then 0 else 1 end) over (partition by objid order by begda) as grouping from (select t.*, lag(endda) over (partition by objid, HASHROW_COL order by begda) as prev_endda from t ) t ) t group by grouping, objid, HASHROW_COL;


0
投票
假设hashrow_col是保持不变的值,(即您需要分组的值),那么您所需要做的就是min(begda)和max(endda)

select objid, min(begda) as begda, max(endda) as enddat, HASHROW_COL, min(rnk) from OTABLE group by objid,hashrow_col

© www.soinside.com 2019 - 2024. All rights reserved.