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;
사용자가 항목을 두 쌍을 가지고 어떤 경우? 유형 1 또는 유형 2 항목이 누락 된 경우 어떻게해야합니까? –
고려해야 할 엣지 케이스가 있습니까? 이러한 모든 행이 동일한 사용자에 대한 것이면 (가능한 경우) 동일한 결과 (동일한 사용자 ID) 또는 단일 행 (최대 기간을 다루는 단일 행 인 경우)이 있습니까? 하나의 '2'로 여러 개의 '1'이있을 수 있습니까? 간단한 예제를 기반으로 쿼리를 작성하는 것은 간단하지만 실제 데이터가 얼마나 가까운 지 궁금합니다. –
사용자 중 한 명에게 추가로 로그인/로그 아웃을 추가하고, 로그 아웃 만있는 사용자와 원하는 출력을 업데이트하여 가장자리 상황 처리에 대한 기대치가 명확 해지도록 사용자를 추가하는 것이 좋습니다. –