2016-11-16 69 views
0

如果我们在SQL Server中有下列数据的表:SQL服务器 - 计数会话 - 差距和岛屿

ID  Log_Time 
1110 2016-10-31 20:34:50.000 
1110 2016-10-31 20:34:58.000 
1110 2016-10-31 20:35:03.000 
1110 2016-11-01 01:28:29.000 
1110 2016-11-01 01:28:33.000 
1110 2016-11-01 01:28:37.000 
1110 2016-11-01 01:28:42.000 
1110 2016-11-01 01:28:46.000 
1110 2016-11-01 01:28:50.000 
1110 2016-11-01 01:28:54.000 
1110 2016-11-01 01:28:59.000 
1110 2016-11-01 01:29:03.000 

假设每个用户操作生成log_time条目。该业务计算用于计费目的的会话数量 - 从会话1开始,如果时间差超过一个小时,则将会话计数增加1.

这是一个相当大的表格与不同的用户ID。我已经尝试了用于循环遍历不同用户的游标组合和通过执行逐行迭代的会话计数来增加WHILE LOOPS。完成这个表格需要很长时间,当这个表格变得更大时,这可能不是正确的方法。必须有更好的方法来做到这一点。任何指针?

的结果集我需要的是这样的:

ID  SessionCount 
1110 28 
1145 42 
1116 38 

回答

1

也许是这样的:

select ID, sum(case when diff is NULL or diff > 60 then 1 else 0 end) 
from (
    select 
    ID, 
    datediff(minute, lag(Log_Time) 
    over (partition by ID order by Log_Time), Log_time) as diff 
    from 
    #tmp 
) X 
group by ID 

这将检查滞后于前一行,如果是超过60(或空,为第一行),那么它的计算结果为1,否则为零。

0

您可以使用“LEAD”和“DATEDIFF”。您可以通过LEAD找到下一个“LogTime”值。

SELECT 
    A.ID, 
    COUNT(A.ID) AS SesionCount 
FROM 
(
    SELECT 
     T.ID, 
     DATEDIFF(HOUR, T.Log_Time, LEAD(T.Log_Time) OVER (ORDER BY T.Log_Time)) AS LogDateDiff 
    FROM 
     @Tbl T 
) A 
WHERE 
    A.LogDateDiff >= 1 
GROUP BY 
    A.ID