我有一张记录任务完成时间的表格。任务属于工作流程,但在此示例中,我只是尝试让LAG正常工作。
我想找到有关每项任务需要多长时间的信息。
我试过了:
select
completed_date,
lag(completed_date) over (order by id) prevrow,
prevrow - completed_date
from
task_complete
where workflow_id = 1
但这会导致错误。有没有办法计算当前行和上一行之间的差异?
答案 0 :(得分:9)
分析函数是查询中执行的最后一组操作 除了最终的ORDER BY子句。所有加入和所有WHERE,GROUP BY和HAVING子句在分析函数之前完成 处理。因此,分析函数只能出现在select中 list或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
)
答案 1 :(得分:2)
您非常接近,请尝试将差异计算移至分析函数列:
select
completed_date,
lag(completed_date) over (order by id) - completed_date diff,
from
task_complete
where workflow_id = 1;
答案 2 :(得分: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);