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 句にのみ表示できます。

これは、クエリの現在のレベルでは分析関数の結果を使用できないことを意味します。

これには 2 つの解決策があります。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 に答える