2012-07-05 32 views
0

所以我正在查詢一些數據並試圖確定每個用戶登錄和註銷之間的時間量。我接近得到這個,但得到的結果不起作用。這裏是我現在所擁有的代碼:TSQL OrderedTable

WITH OrderedTable AS 
(
SELECT EventType 
     , ModuleAndEventText 
     , Time 
     , Node 
     , UserSID 
     , ROW_Number() OVER (Partition BY UserSID ORDER BY UserSID,EventID,Time) RN 
FROM viewevent 
where EventType in ('BROKER_USERLOGGEDIN','BROKER_USERLOGGEDOUT') and usersid = 'S-1-5-21-999033763-294680432-740312968-10026' 
) 

SELECT t1.EventType 
    , t1.ModuleAndEventText 
    , t1.Node 
    , t1.UserSID 
    , t1.Time as TimeIn 
    , t2.Time as TimeOut 
    , DATEDIFF(hour, t1.Time, t2.Time) TimeElapsedInHours 
FROM OrderedTable t1 
JOIN OrderedTable t2 ON t1.UserSID = t2.UserSID AND t2.RN = t1.RN + 1 
WHERE t1.RN % 2 <> 0 
ORDER BY t1.UserSID 

這裏有一些我得到的結果:

BROKER_USERLOGGEDIN  User YRMC_MAIN\jerogers has logged in VMVIEWTC1.yrmc.org S-1-5-21-999033763-294680432-740312968-10026 2012-04-14 08:00:36.137 2012-04-14 09:32:08.267  1 
BROKER_USERLOGGEDIN  User YRMC_MAIN\jerogers has logged in VMVIEWTC1.yrmc.org S-1-5-21-999033763-294680432-740312968-10026 2012-04-14 08:00:36.137 2012-04-14 09:32:08.267  1 
BROKER_USERLOGGEDIN  User YRMC_MAIN\jerogers has logged in VMVIEWWC2.yrmc.org S-1-5-21-999033763-294680432-740312968-10026 2012-06-11 14:50:40.420 2012-06-11 16:43:08.640  2 
BROKER_USERLOGGEDIN  User YRMC_MAIN\jerogers has logged in VMVIEWWC2.yrmc.org S-1-5-21-999033763-294680432-740312968-10026 2012-06-11 17:49:46.330 2012-06-11 18:42:50.047  1 
BROKER_USERLOGGEDOUT User YRMC_MAIN\jerogers has logged out VMVIEWWC2.yrmc.org S-1-5-21-999033763-294680432-740312968-10026 2012-06-11 18:59:40.550 2012-06-12 23:20:16.027  29 
BROKER_USERLOGGEDOUT User YRMC_MAIN\jerogers has logged out VMVIEWWC2.yrmc.org S-1-5-21-999033763-294680432-740312968-10026 2012-06-12 23:20:16.777 2012-06-12 23:20:16.823  0 
BROKER_USERLOGGEDOUT User YRMC_MAIN\jerogers has logged out VMVIEWWC2.yrmc.org S-1-5-21-999033763-294680432-740312968-10026 2012-06-12 23:20:17.120 2012-06-15 13:03:31.807  62 

第2條記錄是正確的。最後幾個不是,它是在選擇登出的記錄,我不清楚如何解決這個問題。這裏是數據:

EventType ModuleAndEventText Time Node UserSID 
BROKER_USERLOGGEDIN  User YRMC_MAIN\jerogers has logged in 2012-04-14 08:00:36.137 VMVIEWTC1.yrmc.org S-1-5-21-999033763-294680432-740312968-10026 
BROKER_USERLOGGEDOUT User YRMC_MAIN\jerogers has logged out 2012-04-14 09:32:08.267 VMVIEWTC1.yrmc.org S-1-5-21-999033763-294680432-740312968-10026 
BROKER_USERLOGGEDIN  User YRMC_MAIN\jerogers has logged in 2012-04-14 08:00:36.137 VMVIEWTC1.yrmc.org S-1-5-21-999033763-294680432-740312968-10026 
BROKER_USERLOGGEDOUT User YRMC_MAIN\jerogers has logged out 2012-04-14 09:32:08.267 VMVIEWTC1.yrmc.org S-1-5-21-999033763-294680432-740312968-10026 
BROKER_USERLOGGEDIN  User YRMC_MAIN\jerogers has logged in 2012-06-11 14:50:40.420 VMVIEWWC2.yrmc.org S-1-5-21-999033763-294680432-740312968-10026 
BROKER_USERLOGGEDIN  User YRMC_MAIN\jerogers has logged in 2012-06-11 16:43:08.640 VMVIEWWC2.yrmc.org S-1-5-21-999033763-294680432-740312968-10026 
BROKER_USERLOGGEDIN  User YRMC_MAIN\jerogers has logged in 2012-06-11 17:49:46.330 VMVIEWWC2.yrmc.org S-1-5-21-999033763-294680432-740312968-10026 
BROKER_USERLOGGEDIN  User YRMC_MAIN\jerogers has logged in 2012-06-11 18:42:50.047 VMVIEWWC2.yrmc.org S-1-5-21-999033763-294680432-740312968-10026 
BROKER_USERLOGGEDOUT User YRMC_MAIN\jerogers has logged out 2012-06-11 18:59:40.550 VMVIEWWC2.yrmc.org S-1-5-21-999033763-294680432-740312968-10026 
BROKER_USERLOGGEDOUT User YRMC_MAIN\jerogers has logged out 2012-06-12 23:20:16.027 VMVIEWWC2.yrmc.org S-1-5-21-999033763-294680432-740312968-10026 
BROKER_USERLOGGEDOUT User YRMC_MAIN\jerogers has logged out 2012-06-12 23:20:16.777 VMVIEWWC2.yrmc.org S-1-5-21-999033763-294680432-740312968-10026 
BROKER_USERLOGGEDOUT User YRMC_MAIN\jerogers has logged out 2012-06-12 23:20:16.823 VMVIEWWC2.yrmc.org S-1-5-21-999033763-294680432-740312968-10026 
BROKER_USERLOGGEDOUT User YRMC_MAIN\jerogers has logged out 2012-06-12 23:20:17.120 VMVIEWWC2.yrmc.org S-1-5-21-999033763-294680432-740312968-10026 
BROKER_USERLOGGEDIN  User YRMC_MAIN\jerogers has logged in 2012-06-15 13:03:31.807 VMVIEWWC2.yrmc.org S-1-5-21-999033763-294680432-740312968-10026 

在此先感謝。 Kameron

+0

這數據看起來有點奇。所以你的用戶可以登錄多次?那麼哪個註銷行應該每個登錄連接到?如果單個註銷應該註銷每個以前的登錄,那麼我認爲你的連接看起來像'AND t1.EventType <> t2.EventType AND t2.RN> t1.RN' – 2012-07-05 16:15:53

回答

1

問題是日誌文件不能整齊地交織登錄和註銷。

這是一種替代方法。它選擇最小的退出時間在每次登錄後:

select ins.UserSID, ins.time as login_time, min(outs.time) as logout_time 
from (SELECT * 
     FROM viewevent 
     where EventType in ('BROKER_USERLOGGEDOUT') 
    ) outs left outer join 
    (SELECT * 
     FROM viewevent 
     where EventType in ('BROKER_USERLOGGEDIN') 
    ) ins 
    on outs.UserSID = ins.UserSID and 
     outs.Time >= ins.Time 
group by ins.UserSID 

我已經離開了用戶ID(你應該添加到兩個子查詢或放置到與條款)的限制,並且的具體計算小時之差(因爲我會使用float而不是int)。

+0

謝謝Gordon,我會給這個一槍。 – Kamster 2012-07-05 16:42:31

0

你能不能添加限制你的T1 WHERE

WITH OrderedTable AS 
(
SELECT EventType 
    , ModuleAndEventText 
    , Time 
    , Node 
    , UserSID 
    , ROW_Number() OVER (Partition BY UserSID ORDER BY UserSID,EventID,Time) RN 
FROM viewevent 
where EventType in ('BROKER_USERLOGGEDIN','BROKER_USERLOGGEDOUT') and usersid = 'S-1-5-21-  999033763-294680432-740312968-10026' 
) 

SELECT t1.EventType 
    , t1.ModuleAndEventText 
    , t1.Node 
    , t1.UserSID 
    , t1.Time as TimeIn 
    , t2.Time as TimeOut 
    , DATEDIFF(hour, t1.Time, t2.Time) TimeElapsedInHours 
FROM OrderedTable2 t1 
JOIN OrderedTable2 t2 ON t1.UserSID = t2.UserSID AND t2.RN = t1.RN + 1 
WHERE t1.RN % 2 <> 0 AND t1.EventType = 'BROKER_USERLOGGEDIN' --ONLY CHANGE IS HERE - THIS RETURNS WHAT MY UNDERSTANDING OF WHAT YOU EXPECT IS 

EventType ModuleAndEventText Node UserSID TimeIn TimeOut TimeElapsedInHours 
-------------------------------------------------------------------------------------- 
BROKER_USERLOGGEDIN User YRMC_MAIN\jerogers has logged in VMVIEWTC1.yrmc.org S-1-5-21-999033763-294680432-740312968-10026 2012-04-14 08:00:36.137 2012-04-14 09:32:08.267 1 
BROKER_USERLOGGEDIN User YRMC_MAIN\jerogers has logged in VMVIEWTC1.yrmc.org S-1-5-21-999033763-294680432-740312968-10026 2012-04-14 08:00:36.137 2012-04-14 09:32:08.267 1 
BROKER_USERLOGGEDIN User YRMC_MAIN\jerogers has logged in VMVIEWWC2.yrmc.org S-1-5-21-999033763-294680432-740312968-10026 2012-06-11 14:50:40.420 2012-06-11 16:43:08.640 2 
BROKER_USERLOGGEDIN User YRMC_MAIN\jerogers has logged in VMVIEWWC2.yrmc.org S-1-5-21-999033763-294680432-740312968-10026 2012-06-11 17:49:46.330 2012-06-11 18:42:50.047 1 
ORDER BY t1.UserSID 
+0

也謝謝你這個例子。這一個接近,但它將下一個記錄記錄爲超時,即使下一個記錄是UserLoggedIn事件類型。 – Kamster 2012-07-05 16:43:42

+0

超時事件不是作爲問題中的信息呈現的,似乎與OP分離,但很高興您找到解決方案。 – user1166147 2012-07-05 16:58:28

0

假設有沒有連接沒有斷開,我喜歡下面的方法生產假的sessionId

declare @tEvent table (
    UserId int, 
    EventType varchar(10), 
    EventDate datetime2 
) 

insert into @tEvent (UserId, EventType, EventDate) values 
(1, 'CONNECT', '20120101'), 
(2, 'CONNECT', '20120101'), 
(1, 'DISCONNECT', '20120102'), 
(1, 'CONNECT', '20120103'), 
(2, 'DISCONNECT', '20120103'), 
(1, 'DISCONNECT', '20120105'), 
(1, 'CONNECT', '20120106') 

select 
    conn.UserId, conn.SessionId, conn.EventDate as startDate, disco.EventDate as endDate, DATEDIFF(d, conn.EventDate, disco.EventDate) as duration 
from 
    (select 
     ROW_NUMBER() over (partition by UserId order by EventDate) SessionId, 
     UserId, 
     EventDate 
    from 
     @tEvent 
    where EventType = 'CONNECT') conn 
    left join (
    select 
     ROW_NUMBER() over (partition by UserId order by EventDate) SessionId, 
     UserId, 
     EventDate 
    from 
     @tEvent 
    where EventType = 'DISCONNECT') disco on conn.UserId = disco.UserId and conn.SessionId = disco.SessionId 
+0

謝謝大家的幫助。 我發現了一個解決方案,我試圖從更多的數據中挖掘出來,並認爲我會與你分享。答案您的問題按鈕不起作用的唯一問題。我會稍後再試。 – Kamster 2012-07-05 16:51:13