2013-05-26 75 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条款数据库。