SQL-запрос для получения среднего значения за заданные периоды времени - PullRequest
4 голосов
/ 23 июня 2011

У меня есть база данных MySQL, которая используется для хранения показаний мощности, причем чтение добавляется один раз в минуту. (т.е. 1440 показаний в день).

time      power
----      -----
00:00:00    346
00:01:00    352
00:02:00    247

Используя PHP, я хочу создать график из этих данных, но я не хочу, чтобы 1440 точек на графике. Я мог бы разделить его на 15-минутные куски (что даст мне 96 баллов). Кроме того, я не хочу просто принимать каждое пятнадцатое значение, так как это даст неверные результаты. Я хочу использовать SQL-запрос, который возвращает данные в 15-минутных блоках и дает среднюю мощность чтения.

Вывод может выглядеть примерно так:

starttime   avgpower
---------   --------
00:00:00         342
00:15:00         490
00:30:00         533

Есть ли функция SQL, которая сделает это для меня? или мне придется выполнить этот расчет в моем коде PHP?

Ответы [ 3 ]

2 голосов
/ 23 июня 2011

Вот ваш запрос:

SELECT STR_TO_DATE(CONCAT(DATE_FORMAT(`time`, '%H'), ':', (FLOOR(DATE_FORMAT(`time`, '%i') / 15) * 15), ':00'), '%H:%i:%s') `starttime`, AVG(`power`) `avgpower`
FROM `tablea`
GROUP BY `starttime`;

Пожалуйста, не стесняйтесь заменять имена таблиц (tablea) и столбцов (time и power) в соответствии с вашей схемой.

Надеюсь, это поможет.

2 голосов
/ 23 июня 2011

Вероятно, вы можете сгруппировать по округленному значению минут / 4, а затем выбрать среднее значение поля считывания мощности.Вы можете предпочесть использовать функцию пола вместо округления количества минут.

0 голосов
/ 22 марта 2013

Была такая же проблема. Как указал Дон Киркби , я решил это следующим кодом:

SELECT time, AVG(power) AS avgpower,  ROUND(UNIX_TIMESTAMP(time)/(15*60)) AS timekey
FROM table
GROUP BY timekey
...