Групповые данные MySQL в произвольно взвешенные ведра
Как подсчитать количество записей в таблице MySQL на основе столбца временной метки за единицу времени, когда единица времени произвольна?
В частности, я хочу подсчитать, сколько временных меток записи упало на 15-минутные ведра в течение заданного интервала. Я понимаю, как это сделать в ведрах в 1 секунду, 1 минуту, 1 час, 1 день и т.д., Используя функции даты MySQL, например
SELECT YEAR(datefield) Y, MONTH(datefield) M, DAY(datefield) D, COUNT(*) Cnt FROM mytable GROUP BY YEAR(datefield), MONTH(datefield), DAY(datefield)
но как я могу группировать 15-минутные ведра?
Ответы
Ответ 1
GROUP BY
YEAR(datefield),
MONTH(datefield),
DAY(datefield),
HOUR(datefield),
FLOOR(MINUTE(datefield)/15)
Вы также можете сказать просто:
SELECT FLOOR(UNIX_TIMESTAMP(datefield)/900) AS t, COUNT(*) AS cnt
FROM mytable
GROUP BY t
с приложением, ответственным за форматирование метки времени за каждые 15-минутный период, чтобы вернуться к удобочитаемому y/m/d/h/m. (Если вам нужно иметь местное время в сумасшедшем часовом поясе, не зависящем от четверть часа, вам понадобится смещение взлома.)
Ответ 2
Как получить INTEGER (HOUR (DateField) * 60 + MINUTES (DateField))/YourInterval.
Таким образом, независимо от вашего интервала, включая час * 60 минут, он будет последовательно удерживать его в течение заданного дня, и вы не будете иметь дело только с 15-минутной сгруппировкой в час, но каждые 15 минут своего СОБСТВЕННОГО часа... Добавьте этот столбец в свою группу по предложению, которое вы можете сделать по его порядковой позиции.
Ответ 3
Просто чтобы вы подумали, вот альтернатива решению FLOOR(MINUTE(datefield)/15)
:
GROUP BY CASE
WHEN MINUTES(datetime) BETWEEN 0 AND 14 THEN 0
WHEN MINUTES(datetime) BETWEEN 15 AND 29 THEN 1
WHEN MINUTES(datetime) BETWEEN 30 AND 44 THEN 2
WHEN MINUTES(datetime) BETWEEN 45 AND 59 THEN 3
END