MrJ
MrJ

Reputation: 1938

Average Time to Reply to Message

Is it possible to calculate the average time to reply to a message just with the following columns:

id | ref | client | admin | date | message

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

Upvotes: 1

Views: 451

Answers (2)

Vincent Savard
Vincent Savard

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

Erwin Brandstetter
Erwin Brandstetter

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!

Concerning GROUP BY 1

I quote the manual here:

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

Related Questions