2

SQL Server 2012には、次のようにログイン時間とログアウト時間を追跡するテーブルがあります。

UserId    Type    InsertDate
2134      1       20120803 06:32:02.230
2134      1       20120803 10:12:24.350
2134      2       20120803 10:29:21.550
2134      2       20120803 14:10:34.220
5915      1       20120802 14:57:57.453
5915      2       20120802 16:59:00.477

(タイプ1はログイン、タイプ2はログアウトです。)

このテーブルにクエリを実行したいのですが、ログインとログアウトのペアごとに計算されたタイムスパンを秒単位で含むユーザーIDのグループ化されたリストを表示するため、次のようになります。

UserID    Duration 
2134      1017 
5915      7263

更新:個々のユーザーに対して複数のログイン/ログアウトのペアが存在する可能性があり、対応するログアウトなしでログインが発生する可能性があります。対応する値がないログインまたはログアウトを無視したいのですが。

4

3 に答える 3

6

SQL Server 2012では、自己結合と集約が少し不要になりました。このソリューションは、同じユーザーによる複数のログインを処理します。

DECLARE @t TABLE(UserID INT, [Type] TINYINT, InsertDate DATETIME);

INSERT @t VALUES
 (2134,1,'20120803 10:12:24.350'),
 (2134,2,'20120803 10:29:21.550'),
 (2134,1,'20120803 11:22:24.350'),
 (2134,2,'20120803 11:47:21.550'),
 (5915,1,'20120802 14:57:57.453'),
 (5915,2,'20120802 16:59:00.477');

;WITH x AS (
  SELECT UserID, [Type], InsertDate, Prev = LAG(InsertDate, 1) OVER 
  (PARTITION BY UserID ORDER BY InsertDate) FROM @t
)
SELECT UserID, DATEDIFF(SECOND, Prev, InsertDate) FROM x WHERE [Type] = 2;

-- or if you want cumulative time per user even if there are multiple login events:

;WITH x AS (
  SELECT UserID, [Type], InsertDate, Prev = LAG(InsertDate, 1) OVER 
  (PARTITION BY UserID ORDER BY InsertDate) FROM @t
)
SELECT UserID, SUM(DATEDIFF(SECOND, Prev, InsertDate)) 
  FROM x WHERE [Type] = 2 GROUP BY UserID;

以前のバージョンでは、より複雑なものを使用できました。

;WITH x AS 
(
  SELECT UserID, [Type], InsertDate, 
    rn = ROW_NUMBER() OVER (PARTITION BY UserID ORDER BY InsertDate)
  FROM @t
)
SELECT x.UserID, DATEDIFF(SECOND, x.InsertDate, y.InsertDate) 
  FROM x INNER JOIN x AS y 
  ON x.UserID = y.UserID
  AND x.rn = y.rn - 1
  WHERE x.Type = 1
  AND y.Type = 2;
于 2012-08-03T14:58:12.467 に答える
0

ログインとログアウトが 1 回しかない場合。

select UserId, DATEDIFF(second,Min(InsertDate),Max(InsertDate)) as Duration, 
from Table1
Group By UserId
于 2012-08-03T14:53:58.423 に答える
0

試す

select datediff(s, min(InsertDate), max(InsertDate)) as diff
from your_table
group by UserId 
于 2012-08-03T14:52:19.047 に答える