Sql-Server
計數會話 - TSQL
如果我們在 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;