2013-06-27 59 views
0

我在Oracle中有一組日期值,我正在執行ORDER BY START_TIME, STOP_TIME,如下面的數據示例所示。如您所見,標記爲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 -- no delay, OK 
6/13/2013 5:19 6/13/2013 6:23 6/13/2013 5:39 
6/13/2013 5:39 6/13/2013 6:04 6/13/2013 6:23 -- delay? wrong 
6/13/2013 6:23 6/13/2013 7:32 6/13/2013 9:18 
6/13/2013 9:18 6/13/2013 9:50 6/13/2013 9:44 
6/13/2013 9:44 6/13/2013 10:01 

該數據表示分配的作業。我所面臨的艱鉅任務是以最有效的方式確定如何分配工作有任何延誤。由於NEXT_START_TIME在STOP_TIME之前出現,因此第一個條目表示沒有延遲。僅當NEXT_START_TIME在之後出現時,我們纔可以認爲STOP_TIME存在延遲(如第三行)。
皺紋是即使第三行似乎表明延遲,這是不正確的。即使NEXT_START_TIME是6:23,也需要注意以前的作業仍在進行中(請參閱兩個突出顯示的項目)。
有沒有辦法做到這一點沒有O(N),或更糟糕的是,迭代?現在使用LEAD()函數是非常有效的。
如果需要請澄清,因爲我意識到這可能很難理解。

回答

3

而不是lead(),你想要一個累積最大。嘗試使用此代替lead()

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

order by子句指示Oracle使這個累積聲明,將採取任何時間最大可達此行。

+0

太棒了!我沒有意識到MAX()會以這種方式工作。它似乎將MAX()直到幷包括轉換行(其中start_time更改)。 – McArthey

+0

是否有可能將NULL值留在STOP_TIME列中作爲NULL,而不是用MAX()值「覆蓋」它們? – McArthey