SQL登录/注销表

时间:2013-05-26 13:52:02

标签: 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所在行的用户名(和其他列):会话登录成功或会话重新连接成功,即用户登录。

我们尝试过使用Distinct&分组按以下查询,但它们似乎不起作用:

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

仅供参考:每次用户登录我们的等时,表格中都会创建一行,因此查询需要选择相关用户名的最新行。

1 个答案:

答案 0 :(得分: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子句。