是否可以使用以下列计算回复邮件的平均时间:
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
答案 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
为输出选择的列可以在ORDER BY和GROUP中引用 BY子句使用列名,列别名或列位置。 列位置是整数,以1:
开头
强调我的。因此,我对选定的第一列进行分组(在两种情况下均为ref
)。只是一个符号捷径。