Рассчитать среднее время в mysql за последние 7 дней - PullRequest
0 голосов
/ 14 июля 2020

Имя таблицы = run_detail

Мне нужно рассчитать среднее время выполнения заданий за последние 7 дней, но в некоторых случаях количество запусков может быть меньше 7 дней. например, ab c имеет только 2 run_date. (4.5 + 6 + ..... + 7) /7=5.83 и (23.9 + 45.7) /2=34.8, а также необходимо рассчитать на основе последних 7 прогонов. например, для 2020-07-04 по 2020-07-10 , а не 2020-07-01

Job_name run_date   rownum count  elapsed_time(sec) avg_time
xyz      2020-07-01   1     10       4.5             ?
xyz      2020-07-02   2     10       6               ?
.......  
xyz      2020-07-10   10    10       7.0             ?
abc      2020-07-01   1      2       23.9            ?
abc      2020-07-02   2      2       45.7            ?

Желаемый выход

Job_name run_date   rownum count  elapsed_time(sec) avg_time
xyz      2020-07-01   1     10       4.5             5.83
xyz      2020-07-02   2     10       6               5.83
.......  
xyz      2020-07-10   10    10       7.0             5.83
abc      2020-07-01   1      2       23.9            34.8
abc      2020-07-02   2      2       45.7            34.8

Не могли бы вы помочь, как достичь среднего времени в mysql

1 Ответ

0 голосов
/ 14 июля 2020

Если вы хотите получить превышение за предыдущие 7 дней, вы можете использовать функции окна:

select t.*,
       avg(elapsed_time) over (partition by job_name
                               order by run_date
                               range between interval -6 day preceding and current row
                              ) as avg_time
from t;

Примечание: это предполагает, что вы действительно хотите шесть предыдущих дней плюс текущая дата. Если вы действительно хотите за 7 дней до 1 дня до (предыдущая неделя), используйте:

range between interval -7 day preceding and interval -1 day preceding

EDIT:

В более старых версиях MySQL вы можете использовать коррелированный подзапрос:

select t.*,
       (select avg(t2.elapsed_time)
        from t t2
        where t2.job_name = t.job_name and
              t2.run_date <= t.run_date and
              t2.run_date > t.run_date - interval 7 day
       ) as avg_time
from t;

Скорректируйте сравнение дат, чтобы получить именно тот период, который вам нужен.

...