Задача: вывести средние значения показаний прибора за определенные интервалы времени, например средние значение за каждые 60 минут
SELECT `id`, DATE_FORMAT(`time`, '%Y-%m-%d %H:%i') as `dt`, avg(val) as `value` FROM `table` GROUP BY `id`, time_to_sec(`time`)- time_to_sec(`time`)%(60*60) ORDER BY `dt` DESC
Что же происходит в запросе:
мы, фактически, работаем с целочисельной арифметикой (что есть быстро). Переводим таймстамп в int, а дальше - каждое поле делим нацело на длину интервала. Отсюда вытекает, что всем записям заданного интервала будет задаваться в соответствие одно и то же целое число, по которому и проводим группировку.
Можно добавить условие на ограничение диапазона по какому-то большому отрезку времени (неделя), я думаю это не составит труда, потому и не привожу пример.
Можно использовать группировку по интервалу с помощью функции date_sub(), но в данном случае проще и читабельнее именно такой подход (мое субъективное мнение)
Упс! Спасибо, случайно нашёл. А думал как реализовать.
ОтветитьУдалитьПолезно, но как исправить запрос, чтобы увидеть среднее значение val при условии, что, например val > 3.1485, т.е. удовлетворить формулировке "вывести средние значения показаний прибора в местах превышения "нормы" ", т.е. разбить на группы в которых val > norm, а не на каждые 60 секунд. Заранее спасибо.
ОтветитьУдалитьКакая структура вашей таблицы? По чем у вас будет группировка? Как должны выглядеть данные которые вы хотите получить?
Удалить