【问题标题】:Oracle analytics: using LAG values in calculation?Oracle 分析:在计算中使用 LAG 值?
【发布时间】:2011-09-01 19:18:29
【问题描述】:

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

我想了解每项任务需要多长时间。

我试过了:

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

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

【问题讨论】:

  • 您遇到的错误是什么?

标签: oracle analytic-functions


【解决方案1】:

根据Oracle documentation

分析函数是查询中执行的最后一组操作 除了最后的 ORDER BY 子句。所有联接和所有 WHERE、GROUP BY 和 HAVING 子句在分析函数执行之前完成 处理。所以解析函数只能出现在select中 列表或 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
)

【讨论】:

    【解决方案2】:

    你已经很接近了,试着把你的差值计算移到解析函数列:

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

    【讨论】:

      【解决方案3】:

      试试这个:

      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);
      

      【讨论】:

        猜你喜欢
        • 2022-01-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-21
        • 2020-12-08
        • 1970-01-01
        • 2020-11-22
        • 2016-02-09
        相关资源
        最近更新 更多