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 に答える