根据同一个表中的第二列查找单个列中的对

时间:2013-04-23 18:04:05

标签: sql db2 recursive-query self-join

我有以下情况

来源表:

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任何帮助将不胜感激!

1 个答案:

答案 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