MYSQL группирует интервал дат по последним 10 минутам - PullRequest
0 голосов
/ 09 января 2019

У меня есть база данных с сообщениями и поле отметки времени. Я хочу выбрать количество для каждой минуты из последних 10 минут. Это мой текущий запрос:

SELECT date_format(timestamp, '%H:%i:%s'), COUNT(*) as count
FROM test
WHERE timestamp BETWEEN DATE_SUB(NOW(), INTERVAL 10 MINUTE) AND NOW() 
GROUP by
    DATE_FORMAT(timestamp, '%i')
    ORDER BY timestamp ASC

Это почти работает так, как я хочу, показывая мне счет за последние 10 минут.

Однако, так как я группирую по метке времени, для каждой минуты, кроме самой последней, я получаю счет из первой записи в базе данных за каждую минуту, делая мой первый и последний результат намного меньше, чем другие.

Как на этом изображении:

enter image description here

отметка времени
11:25:35 6
11:26:03 11
11:27:05 11
11:28:01 12
11:29:03 12
11:30:05 10
11:31:01 12
11:32:03 12
11:33:05 11
11:34:01 12
11:35:03 5

Я ищу способ группировать по минутам, используя что-то вроде NOW () вместо моей метки времени, как в этом примере.

отметка времени
11:25:35 11
11:26:35 12
11:27:35 11
11:28:35 11
11:29:35 11
11:30:35 11
11:31:35 11
11:32:35 11
11:33:35 11
11:34:35 11

enter image description here

Заранее спасибо!

1 Ответ

0 голосов
/ 09 января 2019

Проблема в предложении WHERE. Вам нужно удалить лишние секунды перед агрегацией.

Один из методов - преобразование в секунды, деление на 60, усечение числа и умножение на 60. Далее выполняется преобразование значения обратно в значение даты / времени, поэтому будет использоваться индекс по этому столбцу:

SELECT date_format(timestamp, '%H:%i:%s'), COUNT(*) as count
FROM test
WHERE timestamp >= from_unixtime(floor(unix_timestamp(now()) / 60) * 60) - interval 10 minute AND
      timestamp < from_unixtime(floor(unix_timestamp(now()) / 60) * 60)
GROUP BY DATE_FORMAT(timestamp, '%i')
ORDER BY timestamp ASC
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...