вторник, 7 февраля 2012 г.

MySQL. Группировка по интервалам

Постановка задачи: есть таблица table(id:int, time:timestamp, val:double) в которую периодически заносятся показания некого прибора (например каждые 5 секунд).
Задача: вывести средние значения показаний прибора за определенные интервалы времени, например средние значение за каждые 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(), но в данном случае проще и читабельнее именно такой подход (мое субъективное мнение)

3 комментария:

  1. Упс! Спасибо, случайно нашёл. А думал как реализовать.

    ОтветитьУдалить
  2. Полезно, но как исправить запрос, чтобы увидеть среднее значение val при условии, что, например val > 3.1485, т.е. удовлетворить формулировке "вывести средние значения показаний прибора в местах превышения "нормы" ", т.е. разбить на группы в которых val > norm, а не на каждые 60 секунд. Заранее спасибо.

    ОтветитьУдалить
    Ответы
    1. Какая структура вашей таблицы? По чем у вас будет группировка? Как должны выглядеть данные которые вы хотите получить?

      Удалить