Группировка по фиксированному интервалу - PullRequest
0 голосов
/ 20 ноября 2018

У меня есть время, сохраненное в формате 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 Ответ

0 голосов
/ 20 ноября 2018

Это здесь делает работу:

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`
  • посмотреть, как он работает вживую в sqlfiddle
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...