Среднее время ответа на сообщение - PullRequest
1 голос
/ 09 ноября 2011

Можно ли рассчитать среднее время ответа на сообщение, используя только следующие столбцы:

id | ref | client | admin | date | message
  • id - уникальный номер сообщения
  • ref - ссылочный номер сообщения, который не является уникальным (при поиске ссылки, при сортировке по дате будет показан разговор)
  • client - это идентификатор клиента, если это сообщение клиента, иначе 0, если не клиент
  • admin - это идентификатор администратора, если это сообщение администратора, иначе 0, если не клиент
  • date устанавливается с помощью datetime, являющегося временем сообщения
  • message являющееся отправленным сообщением

Пример данных:

1  | 1   | 1      | 0     | 2011-11-07 01:00:00 | ABC
2  | 1   | 1      | 0     | 2011-11-07 01:01:00 | DEF
3  | 1   | 0      | 1     | 2011-11-07 01:05:00 | abc
4  | 2   | 2      | 0     | 2011-11-07 01:10:00 | 123
5  | 3   | 1      | 0     | 2011-11-07 01:11:00 | abc
6  | 2   | 0      | 1     | 2011-11-07 01:20:00 | a
7  | 3   | 0      | 2     | 2011-11-07 02:11:00 | b

В идеале ищет средний период времени между клиентским сообщением и сообщением администратора, хотя, если есть 2 клиентских сообщения от одного и того же клиента (т. Е. Администратор не ответил на первое сообщение до того, как клиент добавил свое второе сообщение) с помощью тот же реф.

Из примера, время для (1) = 5 минут, (2) = 10 минут, (3) = 60 минут ... среднее = 25 минут (1500 секунд - рад работать за секунды)

Я не уверен, как вообще начать работать над этим .... Я надеюсь, что кто-то может помочь: S

Ответы [ 2 ]

2 голосов
/ 09 ноября 2011

Само собой разумеется, я ненавижу работать с MySQL:

SELECT AVG(delay_answer)
FROM (SELECT MIN(delay_answer) AS delay_answer
      FROM (SELECT M1.ref, client, admin, TIMESTAMPDIFF(SECOND, date_original, date) AS delay_answer
            FROM messages M1
            INNER JOIN (SELECT ref, MIN(date) AS date_original
                        FROM messages
                        GROUP BY ref) M2
            ON M1.ref = M2.ref AND date > date_original
            WHERE admin <> 0 AND client = 0) x
      GROUP BY ref) y;

Возвращает среднее время (в секундах), которое потребовалось администратору для ответа на сообщение (созданное кем-либо, не обязательно клиентом, но это можно легко изменить).

1 голос
/ 09 ноября 2011

Ваш вопрос хорошо сформулирован, но оставляет место для интерпретации. Это одна интерпретация:

SELECT avg(TIMESTAMPDIFF(SECOND, c.c_date, a.a_date) AS avg_time_to_response
FROM   (
    SELECT ref, min(date) AS c_date
    FROM   tbl
    WHERE  client > 0
    GROUP  BY 1
    ) c
JOIN  (
    SELECT ref, min(date) AS a_date
    FROM   tbl
    WHERE  admin > 0
    GROUP  BY 1
    ) a USING (ref)
WHERE a.a_date > c.c_date;

Предоставляет среднее время, которое проходит между первой публикацией клиента и первой публикацией администратора в каждой теме (номер ссылки на сообщение).

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

Прочитайте руководство здесь о TIMESTAMPDIFF().
Спасибо @MrJ и @Vincent за указание на ошибку с вычитанием временных меток!

Относительно GROUP BY 1

Я цитирую руководство здесь :

Столбцы, выбранные для вывода, могут быть указаны в ORDER BY и GROUP. Предложения BY с использованием имен столбцов, псевдонимов столбцов или позиций столбцов . Позиции столбцов являются целыми числами и начинаются с 1:

Акцент мой. Поэтому я группирую по первому выбранному столбцу (ref в обоих случаях). Просто обозначение ярлыка.

...