2

我有一张记录任务完成时间的表格。任务属于工作流,但在此示例中,我只是想让 LAG 正常工作。

我想查找有关每项任务需要多长时间的信息。

我试过了:

select
  completed_date,
  lag(completed_date) over (order by id) prevrow,
  prevrow - completed_date
from
  task_complete
where workflow_id = 1

但这会导致错误。有没有办法计算当前行和上一行之间的差异?

4

3 回答 3

9

根据Oracle 文档

分析函数是查询中执行的最后一组操作,除了最后的 ORDER BY 子句。在处理分析函数之前,所有连接和所有 WHERE、GROUP BY 和 HAVING 子句都已完成。因此,分析函数只能出现在选择列表或 ORDER BY 子句中。

这意味着您不能在当前查询级别中使用分析函数的结果。

有两种解决方案。您可以LAG根据需要在选择列表中包含该函数。请注意,即使使用普通函数,您也会这样做,因为无论如何您都无法在同一选择列表中的其他地方引用列别名(prevrow)。

select
  completed_date,
  lag(completed_date) over (order by id) as prevrow,
  lag(completed_date) over (order by id) - completed_date as date_diff
from
  task_complete
where workflow_id = 1

或者您可以使用子查询来获取结果:

select
  completed_date,
  prevrow,
  prevrow - completed_date as date_diff
from (
  select
    completed_date,
    lag(completed_date) over (order by id) as prevrow
  from
    task_complete
  where workflow_id = 1
)
于 2011-09-01T20:05:51.483 回答
2

您非常接近,请尝试将差异计算移至分析函数列:

select
  completed_date,
  lag(completed_date) over (order by id) - completed_date diff,
from
  task_complete
where workflow_id = 1;
于 2011-09-01T20:08:55.867 回答
0

试试这个:

SELECT completed_date
     , prevrow - completed_date thediff
  FROM (select completed_date,
               lag(completed_date) over (order by id) prevrow
          from task_complete
         where workflow_id = 1);
于 2011-09-01T20:06:50.300 回答