Sql-Server

計數會話 - TSQL

  • November 17, 2016

如果我們在 SQL Server 中有一個包含以下數據的表:

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

正如 Joe 建議的那樣,您應該使用該LAG()函式將值與前一行進行比較。它可以這樣實現:

With LaggedLogTime As (
   Select ID, Log_Time,
       PreviousTime = Lag(Log_Time, 1) Over (Partition By ID Order By Log_Time)
     From #log)
Select ID, 
   SessionCount = Sum(iif(DateDiff(Minute, PreviousTime, Log_Time) > 60 Or PreviousTime Is Null, 1, 0))
 From LaggedLogTime
 Group By ID;

引用自:https://dba.stackexchange.com/questions/155483