我有一个包含列的表:
id,conversation_id,session_id,user_id,message,created_at
每次用户与员工开始对话时,都会启动一个新会话(不同的会话号)。每个员工和用户之间的所有消息都存储在此表中。 created_at列是时间戳。我需要按员工编号过滤掉会话,并计算用户发送的第一条消息与特定员工发回的第一条消息之间的平均响应时间,对于每个会话,忽略客户或员工未回复的外围数据(会话中只有一个用户)
我知道这很复杂,但请帮助!
在user_id列的此示例中,4是员工(请记住还有其他员工)。每次新会话开始时session_id都会发生变化。我必须为特定员工完成每个会话,获取客户和员工发送的第一条消息的时间戳,记录差异,总结所有差异然后取平均值,同时确保会话实际包含两个用户(过滤外围数据)。
到目前为止,我想出了这个:
SELECT * FROM messages WHERE session_id IN( SELECT session_id FROM消息 WHERE user_id = 4) GROUP BY session_id,user_id
从每个客户和员工那里得到第一条消息(给出类似的东西)
所以从这个具体的例子中,我将省略41040行,因为它只包含一个人(第3列,id 1028)并被视为外围数据
答案 0 :(得分:0)
我对一些评论感到震惊...... StackOverflow旨在成为一个帮助他人的社区。如果你要抱怨我的ponctuation或者给出一个模糊,无用的答案,为什么还要费心去评论空间?
无论如何,我想通了。
基本上,我多次加入同一个表,但只查询了必要的数据。在第一次加入时,我使用员工消息查询消息表,并按会话编号对其进行分组。在第二次连接中,我执行了相同的过程,但只提取了用户的消息。通过在会话ID上加入它们,它会自动省略用户或员工不在场的任何会话。默认情况下,groupby返回组中的第一组数据(在这种情况下,我不必操纵groupby,因为我实际上是在查找会话中的第一条消息),然后我取了它们之间的平均差异用户和员工的消息时间戳。在此特定情况下,数字4是员工编号。这是查询的样子此外,在这种情况下,HAVING AVG_RESP > 0
在执行测试时需要删除外围数据:
SELECT AVG(AVG_RESP)
FROM(
SELECT TIME_TO_SEC(TIMEDIFF(t.created_at, u.created_at )) AS AVG_RESP
FROM (
SELECT * FROM messages
WHERE session_id IN (
SELECT session_id FROM messages
WHERE user_id = 4) AND user_id = 4
GROUP BY session_id
) AS t
JOIN(
SELECT * FROM messages
WHERE session_id IN (
SELECT session_id FROM messages
WHERE user_id = 4) AND user_id != 4
GROUP BY session_id
) as u
ON t.session_id = u.session_id
GROUP BY t.session_id
HAVING AVG_RESP > 0
) as ar
希望这对未来的某个人有所帮助,不像那些留下荒谬无用的评论的人。