2010-05-12 43 views
1

我有這樣的表之間的獲取時間SQL Server 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 ... :( – 2010-05-12 18:29:14

回答

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" 

OUTPUT:

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 2010-05-12 19:00:05