SQL Server 2008:如何选择两个连续会话之间的差异小于10分钟的所有会话的总和

我有一个表为用户存储聊天消息.每个消息都记录在此表中.我必须计算特定用户的聊天持续时间.

由于用户可能在x​​时间聊天,并且在x 10次之后他离开聊天.在X 20次之后,用户再次开始聊天.因此,不应考虑x 10和x 20之间的时间段.

表结构和样本数据如图所示.不同的颜色代表同一用户的两个聊天会话.我们可以看到在663和662之间存在超过1小时的差异,因此应该从结果集中排除这些会话.最终结果应该是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上的演示

点赞