0

我有以下情况

源表:

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

4

1 回答 1

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 
于 2013-04-23T18:28:32.573 回答