0

ORDER BY START_TIME, STOP_TIME以下のデータ サンプルのように実行している Oracle の日付値のセットがあります。ご覧のとおり、NEXT_START_TIME というラベルの付いた列は、LEAD() 関数によって取得されます。

START_TIME STOP_TIME NEXT_START_TIME
6/13/2013 5:19 6/13/2013 5:34 6/13/2013 5:19 -- 遅延なし、OK
2013/6/13 5:19   2013/6/13 6:23   2013/6/13 5:39
2013/6/13 5:39 2013/6/13 6:04 2013/6/13 6:23 -- 遅延?違う
2013/6/13 6:23   2013/6/13 7:32 2013/6/13 9:18
2013/6/13 9:18 2013/6/13 9:50 2013/6/13 9:44
2013/6/13 9:44 2013/6/13 10:01

このデータは、割り当てられたジョブを表します。私が抱えている難しい課題は、最も効率的な方法で、ジョブの割り当てに遅延があったかどうかを判断する方法です. 最初のエントリは、NEXT_START_TIME が STOP_TIME の前に来たため、遅延がないことを表しています。NEXT_START_TIME が STOP_TIME の後に来た場合にのみ、遅延があると見なすことができます (3 行目のように)。
問題は、3 行目は遅延を示しているように見えますが、正しくないということです。NEXT_START_TIME が 6:23 であったとしても、前のジョブがまだ進行中であるという事実を認識する必要があります (強調表示された 2 つの項目を参照)。
O(N)、またはさらに悪いことに、反復なしでこれを達成する方法はありますか? 現在、LEAD() 関数の使用は非常に効率的です。
わかりにくいかもしれませんので、必要に応じて説明を求めてください。

4

1 に答える 1

3

の代わりにlead()、累積最大値が必要です。の代わりにこれを使用してみてくださいlead():

select START_TIME, STOP_TIME,
       max(stop_time) over (order by start_time) as MaxCumStopTime
from t

このorder by句は、これを累積ステートメントにするように Oracle に指示します。累積ステートメントは、この行までの任意の時間の最大値をとります。

于 2013-06-27T14:14:48.013 に答える