从“登录历史表”中获取“登录用户”(会话模拟)

时间:2012-09-24 22:34:41

标签: sql-server

我有一张这样的表:

ID | username | domain | operation| datetime 
---+----------+--------+----------+--------------------
1  | john     | depA   | 'login'  | 2012-09-22 13:00:00
2  | mary     | depA   | 'login'  | 2012-09-22 13:10:00
3  | john     | depA   | 'login'  | 2012-09-24 13:25:00
4  | john     | depA   | 'logout' | 2012-09-24 13:55:00

我想在过去20小时(日期时间)内获取(SELECT DISTINCT)所有“用户名,域名”,其最后一次操作是登录(最后没有注销)。

这个想法是让“目前所有用户都参加会议。”

我希望只在一个查询中处理结果。

请问任何想法?我找不到用T-SQL获取结果的方法。

2 个答案:

答案 0 :(得分:2)

您可以使用公用表表达式来过滤日期,然后在查询中使用它两次以获取每个用户的最新活动:

;WITH RecentLogins AS
(SELECT username, operation, logdate
FROM logins
WHERE logdate >= DATEADD(hh, -20, GETDATE()))

SELECT r1.* 
FROM RecentLogins r1
WHERE logdate = (
    SELECT MAX(logdate) 
    FROM RecentLogins r2
    WHERE r1.username = r2.username AND r1.domain = r2.domain)
AND operation = 'login'

答案 1 :(得分:0)

您可以使用DATEADD功能,只需使用负号。

SELECT DISTINCT username, domain FROM table_name
WHERE operation = 'login' AND datetime >= DATEADD(Hour, -20, CURRENT_TIMESTAMP)