我有一个表,用于存储用户的聊天消息。每条消息都记录在此表中。我必须计算特定用户的聊天持续时间。
因为有可能用户在 x 次聊天,但在 x+10 次后他离开聊天。 X+20 时间后,用户再次开始聊天。因此 x+10 和 x+20 之间的时间段不应被计算在内。
表结构和示例数据如图所示。不同的颜色代表同一用户的两个聊天 session 。我们可以看到,663 和 662 之间存在超过 1 小时的差异,因此此类 session 应从结果集中排除。最终结果应为 2.33 分钟。
declare @messagetime1 as datetime
declare @messagetime2 as datetime
select @messagetime1=messagetime from tbl_chatMessages where ID=662
select @messagetime2=messagetime from tbl_chatMessages where ID=659
print datediff(second,@messagetime2,@messagetime1)
Result --- 97 seconds
declare @messagetime3 as datetime
declare @messagetime4 as datetime
select @messagetime3=messagetime from tbl_chatMessages where ID=668
select @messagetime4=messagetime from tbl_chatMessages where ID=663
print datediff(second,@messagetime4,@messagetime3)
Result -- 43 seconds
请提出一个计算聊天持续时间的解决方案。这是我能想到的逻辑之一,以防你们中有人有更好的想法。请分享解决方案
最佳答案
首先需要计算相邻消息之间的间隙,如果间隙超过600秒,那么这些消息之间的时间为0
SELECT SUM(o.duration) / 60.00 AS duration
FROM dbo.tbl_chatMessages t1
OUTER APPLY (
SELECT TOP 1
CASE WHEN DATEDIFF(second, t2.messageTime, t1.messageTime) > 600
THEN 0
ELSE DATEDIFF(second, t2.messageTime, t1.messageTime) END
FROM dbo.tbl_chatMessages t2
WHERE t1.messageTime > t2.messageTime
ORDER BY t2.messageTime DESC
) o(duration)
请参阅 SQLFiddle
上的演示
关于SQL Server 2008 : how to select sum of all sessions where difference between two consecutive sessions is less than 10 minutes,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18046591/