我有一个带有列的表:
id,session_id,session_id,user_id,message,created_at
每次用户与员工进行对话时,都会启动一个新会话(不同的会话号)。每个员工和用户之间的所有消息都存储在此表中。created_at列是一个时间戳。我需要按员工编号筛选出会话,并计算用户发送的第一条消息与特定员工发回的第一条消息之间的平均响应时间,对于每个会话,无论客户或员工都未答复的偏远数据(会话中只有一个用户)
我知道这很复杂,但请帮忙!
在此示例中,在user_id列中,4是雇员(请记住还有其他雇员)。每当新的对话开始时,session_id都会更改。我必须为特定的员工进行每次会话,记录客户和员工发送的第一条消息的时间戳,取其差额,求和所有差额,然后取平均值,同时确保该会话实际上包含两个用户(过滤外围数据)。
到目前为止,香港专业教育学院想出了这个:
SELECT * FROM消息所在的session_id为IN(SELECT session_id从消息所在的user_id = 4)GROUP BY session_id,user_id
从每个客户和员工那里得到第一条消息(给出类似的信息)
因此,从此特定示例开始,我将省略第41040行,因为仅该会话仅包含1个人(第3列,ID为1028),并且被视为外围数据
实际上,我对某些评论感到震惊... StackOverflow旨在成为一个帮助他人的社区。如果您要抱怨我的举动或给出模糊,无用的答案,为什么还要打扰甚至占用评论空间?
无论如何,我想通了。
基本上,我多次加入同一张表,但只查询必要的数据。在第一个联接中,我用员工消息查询了消息表,并按会话号对它们进行了分组。在第二个联接中,我执行了相同的过程,但只从用户中提取了消息。通过在会话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
希望这对将来的人有所帮助,与那些留下可笑,无用评论的人不同。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句