Как усреднить значение во временном окне за несколько дней, в Mysql? - PullRequest
0 голосов
/ 16 ноября 2018

Имея эту простую таблицу журналов

id  |val   |dt
-------------------------
 A  100     2014-01-15 00:00:00     
 A  160     2014-01-15 00:00:00      
 A  100     2014-01-15 01:00:00     
 A  160     2014-01-15 02:00:00
 A  200     2014-01-15 03:00:00
 A  80      2014-01-16 01:00:00
 B  100     2014-01-16 02:00:00
 B  200     2014-01-16 01:00:00
 B  100     2014-01-15 02:00:00
 and so on...

Я могу усреднить ЕДИНСТВЕННЫЙ день (15) из ЕДИНОГО заданного идентификатора (A) в указанном диапазоне (0-2), выполнив это

select id, 
       date(dt),
       AVG(val) as av
from (SELECT id, val, dt
      FROM test
      WHERE id = 'A' AND 
            (date(dt) BETWEEN '2014-01-15' AND '2014-01-15') AND 
            ( (time(dt) BETWEEN '00:00' AND '02:00'))) as outerTable

Я получаю этот ЕДИНСТВЕННЫЙ результат

id  |date   | average 00:00 to 2:00
-------------------------
A   2014-01-15  120.0000

Но как решить эту среднюю из НЕСКОЛЬКИХ дней за один и тот же период времени, но за многие дни в диапазоне месяцев? лет? как

id  |date   | average 00:00 to 2:00
-------------------------
A   2014-01-15  120.0000
A   2014-01-16  80.0000 
A   2014-01-17  35.0000
and so on...

Необходимость зацикливания одного и того же запроса в разные дни в течение всего месяца или года, конечно, буквальный цикл можно выполнить в php, но он МЕДЛЕННЫЙ, также я мог бы зацикливать каждый идентификатор, делая его медленнее.

1 Ответ

0 голосов
/ 16 ноября 2018

Вам не нужно использовать подзапрос, чтобы получить данные и затем вычислить среднее значение в запросе Outer. Это можно сделать без самого подзапроса.

Чтобы получить среднее значение для разных дат, вы можете удалить условие WHERE для даты, чтобы получить данные для всех дат. Вы также можете изменить условие WHERE на дату, чтобы вместо него включить диапазон.

Вы также хотите получить результаты для других значений id. Мы можем избавиться от условия WHERE на id.

В конце концов, вы можете сделать GROUP BY для id и date, чтобы получить отдельные строки в idwise, а затем в datewise.

SELECT 
  id, 
  DATE(dt)
  AVG(val) 
FROM test
WHERE 
  TIME(dt) BETWEEN '00:00' AND '02:00'
GROUP BY id, DATE(dt)
...