2010-05-12 4 views
1

Je possède ce tableauSQL Server 2008: la durée Obtenir entre les sessions utilisateur

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 

Je voudrais être en mesure de trouver les jours entre la fin d'une session au début de la prochaine session pour chaque utilisateur particulier .

Je cherche à obtenir quelque chose comme

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

Merci!

+1

Dommage que SQL Server n'ait pas LEAD/LAG ... :( –

Répondre

2

Essayez:

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" 

SORTIE:

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

(5 row(s) affected) 

si vous ne voulez pas inclure ceux avec une correspondance ligne suivante (uncomment WHERE) et obtenir ce jeu de résultats:

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

(3 row(s) affected) 
+0

merci, votre solution est aussi correcte je pense .je vais vous donner le crédit parce que vous avez mis plus d'effort dans votre réponse – super9