Как вернуть среднее время обработки за последние x месяцев, для журналов, запущенных только за последние 24 часа - PullRequest
0 голосов
/ 06 июня 2019

У меня есть таблица, которая содержит журналы времени обработки. Я добавил столбец Elapsed, который возвращает секунды в зависимости от времени начала и окончания. Возвращенные строки предназначены для заданий, выполненных за последние 24 часа. Я также хочу добавить столбец, который показывает среднее время обработки за последние 3 месяца, а затем разницу между сегодняшним днем ​​и средним значением за 3 месяца.

SELECT Job
      ,RunDate
      ,Start
      ,End
      ,DATEDIFF(second,start,end) 'Elapsed(s)'
  FROM table.jobs
  where RunDate between DATEADD (HOUR,-24,GETDATE()) and GETDATE()
  order by Job

Мой запрос возвращает это:

Job     RunDate     Start     End         Elapsed(s)
----------------------------------------------------------
1       2019/06/05  00:12:23  00:13:50    87
2       2019/06/05  00:15:23  00:17:50    147
3       2019/06/05  00:12:00  00:13:50    110
4       2019/06/05  00:10:23  00:11:23    60
5       2019/06/05  01:34:10  01:50:49    999

Что бы я хотел вернуть:

Job     RunDate     Start     End         Elapsed(s)     3monthAVG     Diff
------------------------------------------------------------------------------
1       2019/06/05  00:12:23  00:13:50    87             90            3
2       2019/06/05  00:15:23  00:17:50    147            140           -7
3       2019/06/05  00:12:00  00:13:50    110            120           10
4       2019/06/05  00:10:23  00:11:23    60             55            -5
5       2019/06/05  01:34:10  01:50:49    999            1012          13

1 Ответ

1 голос
/ 06 июня 2019

Вы можете предварительно рассчитать average, используя CTE.Будьте в курсе работ, которые потерпели неудачу, которые могут испортить ваш average.

 with last3months as (
  SELECT Job
      ,avg(DATEDIFF(second,start,end)) as ThreeMonthAverage
  FROM table.jobs
  where RunDate between DATEADD (MONTH,-3,GETDATE()) and GETDATE()
  group by Job
)
 SELECT j.Job
      ,j.RunDate
      ,j.Start
      ,j.End
      ,DATEDIFF(second,j.start,j.end) 'Elapsed(s)'
      ,l3.ThreeMonthAverage
      ,l3.ThreeMonthAverage - DATEDIFF(second,j.start,j.end) as Diff
  FROM table.jobs as j
  join last3months as l3
    on l3.job = j.job
  where RunDate between DATEADD (HOUR,-24,GETDATE()) and GETDATE()
  order by Job
...