2013-05-26 73 views
1

我們有一個表可以跟蹤用戶登錄和註銷。SQL登錄/註銷表

該查詢中的最後一個動作的第一順序等返回所有記錄:

SELECT [entryid] 
     ,[index] 
     ,[sessionid] 
     ,[UserName] 
     ,[UserPublicIP] 
     ,[EntryDateTime] 
     ,[ServerIP] 
     ,[EventDesc] 
    FROM [DB].[dbo].[table] 
    order by EntryDateTime desc 

我們需要一個查詢返回當前登錄的用戶

的可能值:EventDesc是:

Session Login Succeeded 
Session Logoff Succeeded 
Session reconnection succeeded 
Session has been disconnected 
Shell start notification received 
etc 

我們如何創建q SQL查詢,它列出最後一個EntryDesc所在行的用戶名(&其他列):Session Login Suc ceeded或Session重新連接成功,即用戶登錄

我們已經用鮮明& GROUP BY查詢的,如下面的嘗試,但他們似乎並不管用。

Select * From [DB].[dbo].[table] Group By Username 
Select Distinct Username From [DB].[dbo].[table] 

供參考:一排在創建表每次用戶登錄在我們的等等,所以查詢需要選擇用戶名的最新行。

回答

1

您正在查找給定日期之前每個用戶的最後一條記錄。從你的語法來看,我猜測你正在使用SQL Server。如果是這樣,你可以用row_number()來做到這一點。下面的查詢獲取最後一排一個給定的日期前:

select t.* 
from (select t.*, 
      row_number() over (partition by Username order by EntryDatetime desc) as seqnum 
     from t 
     where EntryDatetime < @Datetime 
    ) t 
where seqnum = 1; 

要聚合這一點,並獲得數:

select count(*) 
from (select t.*, 
      row_number() over (partition by Username order by EntryDatetime desc) as seqnum 
     from t 
     where EntryDatetime < @Datetime -- <-- remove this for the most recent entries 
    ) t 
where seqnum = 1 and 
     EntryDesc in ('Session Login Succeeded', 'Session reconnection succeeded'); 

,如果你想在最近的條目,則可以去除內where條款數據庫。