Группировка по фиксированному интервалу
У меня время хранится в формате unix int
, Я хочу сгруппировать результат по интервалам в 1 день, т.е. 86400 секунд.
Пример данных
timestamp | state
+++++++++++++++++++
1540427604 | ABC
1540770300 | PQR
1540770050 | PQR
1540751300 | ABC
Я хочу сгруппировать количество state
по периоду каждого 86400, то есть если кто-то спросил от 1540425600 (т.е. 25 октября 2018 года) до 1540771200 (то есть 29 октября 2018 года), то вывод должен быть
range | state | count
++++++++++++++++++++++++++++++++++++++++++
1540425600 - 1540512000 | ABC | 1
1540684800 - 1540771200 | ABC | 1
1540684800 - 1540771200 | PQR | 2
Я пробовал это так много вещей, но это то, что я думаю, ближе к..
select
concat(86400*floor(timestamp /86400), '-', 86400*floor(timestamp/86400) + 86400) as `range` , count(state)
from MT
where timestamp between MINDATE AND MAXDATE
group by `range` order by `range`;
Но вывод, который я получаю, не начинается с переданного значения MINDATE или кратного MINDATE... но он находится в диапазоне 86400. Я хочу, чтобы диапазон всегда начинался с mMINDATE, если такая запись существует ИЛИ во множественном числе из MINDATE * 86400
Пожалуйста помоги.
1 ответ
Решение
Это здесь делает работу:
select
concat(min(floor(timestamp / 86400) * 86400), ' - ', max(floor(timestamp / 86400) * 86400) + 86400) as `range`
, state
, count(*)
from t
group by floor(timestamp / 86400), state
order by `range`
- увидеть это работает вживую в http://sqlfiddle.com/