SQL Server 2008: получение продолжительности между сеансами пользователя - PullRequest
1 голос
/ 12 мая 2010

У меня есть эта таблица

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 Ответ

2 голосов
/ 12 мая 2010

Попробуйте:

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...