2

我有一张这样的桌子:

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

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

这个想法是让“当前在会话中的所有用户”。

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

请问有什么想法吗?我找不到仅使用 T-SQL 获得结果的方法。

4

2 回答 2

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'
于 2012-09-24T23:31:11.463 回答
0

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

SELECT DISTINCT username, domain FROM table_name
WHERE operation = 'login' AND datetime >= DATEADD(Hour, -20, CURRENT_TIMESTAMP)
于 2012-09-24T22:49:23.570 回答