Я попробовал решение Hammerite в своем проекте, но оно не сработало там, где отсутствовали образцы из серии. Вот пример запроса, который должен выбрать метку времени (ts), имя пользователя и среднюю меру из metric_table и сгруппировать результаты по 27-минутным временным интервалам:
select
min(ts),
user_name,
sum(measure) / 27
from metric_table
where
ts between date_sub('2015-03-17 00:00:00', INTERVAL 2160 MINUTE) and '2015-03-17 00:00:00'
group by unix_timestamp(ts) div 1620, user_name
order by ts, user_name
;
Примечание: 27 минут (в выбранном) = 1620 секунд (в группе по), 2160 минут = 3 дня (это временной диапазон)
Когда я запустил этот запрос для временного ряда, в котором выборки были записаны нерегулярно (другими словами: для любой данной временной отметки не было гарантии найти значения мер для всех имен пользователей), результаты не были отмечены в соответствии с интервалом были размещены не каждые 27 минут). Я подозреваю, что это произошло из-за того, что min (ts) возвращала временную отметку в некоторых группах, которая была больше ожидаемого минимума (интервал ts0 + i *). Я изменил предыдущий запрос на этот:
select
from_unixtime(unix_timestamp(ts) - unix_timestamp(ts) mod 1620) as ts1,
user_name,
sum(measure) / 27
from metric_table
where
ts between date_sub('2015-03-17 00:00:00', INTERVAL 2160 MINUTE) and '2015-03-17 00:00:00'
group by ts1, user_name
order by ts1, user_name
;
и работает нормально, даже если отсчеты отсутствуют. Я думаю, это потому, что как только математика времени перемещается для выбора, это гарантирует, что ts1 будет соответствовать временным шагам.