Аналитика Oracle: использование значений LAG в расчетах? - PullRequest
2 голосов
/ 01 сентября 2011

У меня есть таблица, которая записывает, когда задачи были выполнены.Задачи относятся к рабочему процессу, но в этом примере я просто пытаюсь заставить работать LAG.

Я хотел бы найти информацию о том, сколько времени занимает каждая задача.

Я пытался:

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

Но это приводит к ошибке.Есть ли способ рассчитать разницу между текущей строкой и предыдущей строкой?

Ответы [ 3 ]

9 голосов
/ 02 сентября 2011

Согласно документации Oracle :

Аналитические функции - это последний набор операций, выполненных в запросе. за исключением заключительного предложения ORDER BY. Все присоединяется и все ГДЕ, ГРУППА Предложения 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
)
2 голосов
/ 02 сентября 2011

Вы очень близки, попробуйте перенести вычисление разницы в столбец аналитической функции:

select
  completed_date,
  lag(completed_date) over (order by id) - completed_date diff,
from
  task_complete
where workflow_id = 1;
0 голосов
/ 02 сентября 2011

Попробуйте это:

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