回复邮件的平均时间

时间:2011-11-08 22:00:03

标签: mysql database time average

是否可以使用以下列计算回复邮件的平均时间:

id | ref | client | admin | date | message
  • id是唯一的消息编号
  • ref是邮件参考号,不是唯一的(搜索引用,按日期排序会显示对话)
  • client是客户端的ID,如果是客户端消息,否则为0,如果不是客户端
  • admin是admin的ID,如果是管理员消息,否则为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 个答案:

答案 0 :(得分:2)

不用说,我讨厌使用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 :(得分:1)

你的问题制定得很好,但留下了解释的余地​​。这是一种解释:

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()的{​​{3}} Thanx到@MrJ和@Vincent通过减去时间戳来指出错误!

关于GROUP BY 1

manual here

  

为输出选择的列可以在ORDER BY和GROUP中引用   BY子句使用列名,列别名或列位置。   列位置是整数,以1:

开头

强调我的。因此,我对选定的第一列进行分组(在两种情况下均为ref)。只是一个符号捷径。