Как подсчитать среднее количество звонков каждые 5 минут, используя datetime sql - PullRequest
0 голосов
/ 19 октября 2018

Я выполняю следующий запрос

select DateTime
from Calls
where DateTime > '17 Oct 2018 00:00:00.000' and
      DialedNumberID = '1234'

Что бы мне это дало, это список всех случаев, когда этот номер набирался на определенную дату.

pic here:

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

Спасибо

Ответы [ 2 ]

0 голосов
/ 19 октября 2018

Среднее количество вызовов за интервал - это количество вызовов (COUNT(*)), деленное на минуты между началом и концом отслеживаемого периода (TIMESTAMPDIFF(minute, period_start, period_end)), умноженное на количество минут в требуемом интервале (пять в вашем примере).

Для MySQL:

select count(*) / timestampdiff(minute, date '2018-01-01', now()) * 5 as avg_calls
from calls
where `datetime` >= date '2018-01-01'
and dialednumberid = 1234;

Для SQL Server:

select count(*) * 1.0 / datediff(minute, '20180101', getdate()) * 5 as avg_calls
from calls
where [datetime] >= '20180101'
and dialednumberid = 1234;
0 голосов
/ 19 октября 2018

Полагаю, у вас есть таблица с именем 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, так же, как зарезервированное слово.

...