MYSQL - Average Time to Reply to Message
العربية
български
català
中文
čeština
dansk
Nederlands
eesti
suomi
français
Deutsch
Ελληνικά
עברית
हिंदी
magyar
Bahasa Indonesia
italiano
日本語
한국어
latviešu
lietuvių
norsk
polski
Português
română
русский
slovenčina
slovenski
español
svenska
ไทย
Türkçe
українська
Tiếng Việt
Is it possible to calculate the average time to reply to a message just with the following columns:
id | ref | client | admin | date | message
idis the unique message numberrefis the message reference number, which is not unique (searching for ref, ordering by date will show a conversation)clientis ID of client, if it is a client message, else 0 if not a clientadminis ID of admin, if it is an admin message, else 0 if not a clientdateis set up usingdatetimebeing the time of the messagemessagebeing the message sent
Example Data:
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
Ideally looking for the average time period between a client message and an admin message, though if there are 2 client messages from the same client (ie. admin didn't reply to first message before client added their 2nd message) with the same ref.
From example, time for (1) = 5 minutes, (2) = 10 minutes, (3) = 60 minutes ... average = 25 minutes (1500 seconds - happy to get work with seconds)
I'm not sure how to even begin working on this.... I do hope someone can help :S
Answer |
Your question is well formulated but leaves room for interpretation. This is one interpretation:
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;
Gives you the average time that passes between the first client posting and the first admin posting per thread (message reference number).
Unanswered messages are ignored. Threads started by Admins would confuse the result with negative durations, so I excluded those. Only the first response time per thread goes into the result. Additional postings on the same thread are ignored here.
Read the manual here about TIMESTAMPDIFF().
Thanx to @MrJ and @Vincent for pointing out the mistake with the subtraction of timestamps!
Concerning GROUP BY 1
Columns selected for output can be referred to in ORDER BY and GROUP BY clauses using column names, column aliases, or column positions. Column positions are integers and begin with 1:
Emphasis mine. So I group on the first column that is selected (ref in both cases). Just a notational shortcut.