Reputation: 1938
Is it possible to calculate the average time to reply to a message just with the following columns:
id | ref | client | admin | date | message
id
is the unique message numberref
is the message reference number, which is not unique (searching for ref, ordering by date will show a conversation)client
is ID of client, if it is a client message, else 0 if not a clientadmin
is ID of admin, if it is an admin message, else 0 if not a clientdate
is set up using datetime
being the time of the messagemessage
being the message sentExample 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
Upvotes: 1
Views: 451
Reputation: 35927
Needless to say, I hate working with 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;
This returns the average time (in seconds) that it took for an admin to answer a message (created by anyone, not necessarily a client, but this can easily be changed).
Upvotes: 2
Reputation: 657867
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!
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.
Upvotes: 1