我有以下情况
来源表:
Col1 Col2 Time
I1 CRR T0
I1 CRH T1
I1 CRH T2
I1 CRR T3
I1 CRH T4
I1 CRR T5
I1 CRH T6
I2 CRH T7
I2 CRR T8
这里的值对是(CRH,CRR) - CRH是起始事件,CRR是结束事件。 我需要在相应的起始事件(这是基于时间列决定)之前消除所有结束事件,并且还捕获有效的起始事件和结束事件对。如果在结束事件之前有多个开始事件,则需要选择最早建立该事件对。这是期望的结果
Col1 Col2 Time Col3 Col4
I1 CRH T1 CRR T3
I1 CRH T4 CRR T5
I1 CRH T6 - - (since no corresponding end event - this is fine)
I2 CRH T7 CRR T8
我正在使用DB2任何帮助将不胜感激!
答案 0 :(得分:0)
如果您使用的是更新版本的db2,则可以使用lag()
和lead()
函数。
如果是这样,试试这个:
select col1, col2, time, nextcol2, nexttime
from (select t.*,
lead(col2) over (partition by col1 order by time) as nextcol2
lead(time) over (partition by col1 order by time) as nexttime
from t
) t
where not(col2 = 'CRR' and nextcol2 = 'CRH')
如果您没有lead()
函数,则可以使用相关子查询执行类似操作。
评论大大澄清了你想要的东西。您正在寻找一个特定开始后的下一个结束。为此,我使用相关子查询来获取下一次。以下是查询的结构:
select t.*, tend.col2, tend.time
from (select t.*,
(select MIN(time) from t t2 where t.col1 = t2.col1 and t2.time > t.time and t2.col2 = 'CRR'
) endtime
from t
where col2 = 'CRH'
) t left outer join
t tend
on t.col1 = tend.col1 and t.time = tend.endtime