1

我们有一个跟踪用户登录和退出的表。

此查询按最后一个操作的顺序返回所有记录,等等:

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 & Group By 查询,如下所示,但它们似乎不起作用:

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

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

4

1 回答 1

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如果您想要数据库中的最新条目,您可以删除内部子句。

于 2013-05-26T13:57:06.037 回答