Полагаю, у вас есть таблица с именем Calls
со столбцами DateTime
и DialedNumberID
.
Вы можете суммировать информацию в этой таблице из года в год, используя вид шаблона.
SELECT YEAR(`DateTime`),
DialedNumberID,
COUNT(*) call_count
FROM Calls
GROUP BY YEAR(`DateTime`), DialedNumberID
Хитрость в этом паттерне - GROUP BY f(date)
.Функция f()
уменьшает любую дату до года, в который она произошла.
Сводка по пятиминутным интервалам, вам нужно f(date)
, которое уменьшает метки даты до пятиминутных интервалов.Эта функция намного сложнее, чем YEAR()
.
DATE_FORMAT(datestamp,'%Y-%m-%d %H:00') + INTERVAL (MINUTE(datestamp) - MINUTE(datestamp) MOD 5)
Учитывая, например, 2001-09-11 08:43:00
, это возвращает 2001-09-11 08:40:00
.
Итак, вот ваше резюме попять минутных интервалов.
SELECT DATE_FORMAT(`DateTime`,'%Y-%m-%d %H:00')+INTERVAL(MINUTE(`DateTime`)-MINUTE(datestamp) MOD 5) interval_beginning,
DialedNumberID,
COUNT(*) call_count
FROM Calls
GROUP BY DATE_FORMAT(`DateTime`,'%Y-%m-%d %H:00')+INTERVAL(MINUTE(`DateTime`)-MINUTE(datestamp) MOD 5),
DialedNumberID
Вы можете сделать этот запрос более понятным и менее повторяющимся, определив сохраненную функцию для этого уродливого DATE_FORMAT()
выражения.Но это тема для другого дня.
Наконец, добавьте
WHERE YEAR(`DateTime`) = YEAR(NOW())
AND DialedNumberID = '1234'
к запросу для фильтрации по текущему году и определенному идентификатору.
Этот запрос потребуетсяработать, чтобы сделать его максимально эффективным.Это тоже тема для другого дня.
Совет Pro: DATETIME
- зарезервированное слово в MySQL.Имена столбцов обычно не чувствительны к регистру.Избегайте именования столбцов, в данном случае DateTime
, так же, как зарезервированное слово.