0

我在 Oracle 中有一组日期值,我正在ORDER BY START_TIME, STOP_TIME按照下面的数据示例进行操作。如您所见,标记为 NEXT_START_TIME 的列是通过 LEAD() 函数检索的。

START_TIME STOP_TIME NEXT_START_TIME
2013 年 6 月 13 日 5:19 2013 年 6 月 13 日 5:34 2013 年 6 月 13 日 5:19 -- 没有延迟,好的
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之后的情况下,我们才能认为存在延迟(如第三行所示)。
皱纹是,即使第三行似乎表明延迟,它也不正确。即使 NEXT_START_TIME 是 6:23,它也需要知道之前的工作仍在进行中(参见两个突出显示的项目)。
有没有办法在没有 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 回答