2016-11-16 64 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