跨行维护日期范围计算而不循环

时间:2013-06-27 13:58:30

标签: sql oracle date-range

我在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()函数非常有效 如果需要,请询问澄清,因为我意识到这可能很难理解。

1 个答案:

答案 0 :(得分:3)

而不是lead(),您需要累积最大值。尝试使用此代替lead()

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

order by子句指示Oracle将其作为累积语句,这将占用此行的任何时间的最大值。