2010-05-12 4 views
1

사용자 세션 사이 얻기 기간SQL 서버 2008 :이 테이블이

UserID SessionID SessionStart SessionEnd 
----------------------------------------------- 
1  abc1  2010-1-1  2010-1-2 
5  def3  2010-1-5  2010-1-9 
1  llk0  2010-1-10  2010-1-11 
5  spo8  2010-1-13  2010-1-15 
1  pie7  2010-1-16  2010-1-29 

나는 각각의 특정 사용자에 대해 다음 세션의 시작 하나 개의 세션의 끝 사이의 일을 찾을 수 있도록하고 싶습니다 .

그래서 나는

UserID DaysBetweenSessions 
----------------------------- 
1  8 
1  5 
5  4 

감사 같은 것을 얻기 위해 찾고 있어요!

+1

너무 나쁜 SQL Server에는 LEAD/LAG가 없습니다. ... ( –

답변

2

시도 :

DECLARE @YourTable table (UserID int, SessionId char(5), SessionStart datetime, SessionEnd datetime) 
INSERT @YourTable VALUES (1,'abc1','2010-1-1 ','2010-1-2') 
INSERT @YourTable VALUES (5,'def3','2010-1-5 ','2010-1-9') 
INSERT @YourTable VALUES (1,'llk0','2010-1-10','2010-1-11') 
INSERT @YourTable VALUES (5,'spo8','2010-1-13','2010-1-15') 
INSERT @YourTable VALUES (1,'pie7','2010-1-16','2010-1-29') 

;WITH AllStarts AS 
(SELECT 
    UserID, SessionEnd,row_number() over (partition by UserID order by SessionStart) as EndRank 
    FROM @YourTable 
) 
, AllEnds AS 
(SELECT 
    UserID, SessionStart, row_number() over (partition by UserID order by SessionEnd) as StartRank 
    FROM @YourTable 
) 
SELECT 
    s.UserID, DATEDIFF(day,s.SessionEnd,ISNULL(e.SessionStart,GETDATE())) AS DaysBetweenSessions 
    FROM AllStarts    s 
     LEFT OUTER JOIN AllEnds e on s.UserID = e.UserID and e.StartRank=s.EndRank+1 
    --WHERE e.UserID is not NULL --include to remove "ones in progress" 

출력 :

UserID  DaysBetweenSessions 
----------- ------------------- 
1   8 
1   5 
1   103 
5   4 
5   117 

(5 row(s) affected) 

당신은 일치하는 다음 행 아웃합니다 (WHERE 주석)을 가진 사람을 포함하고,이 결과 세트를 얻을하지 않으려면 :

UserID  DaysBetweenSessions 
----------- ------------------- 
1   8 
1   5 
5   4 

(3 row(s) affected) 
+0

고맙습니다. 해결책은 정확합니다. 나는 당신에게 줄 것입니다. 당신이 당신의 대답에 더 많은 노력을 기울이기 때문에 신용 – super9