我们有一个跟踪用户登录和退出的表。
此查询按照上一个操作的顺序返回所有记录等:
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]
仅供参考:每次用户登录我们的等时,表格中都会创建一行,因此查询需要选择相关用户名的最新行。
答案 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
子句。