我很难找到一个正常工作的SQL查询: 我需要根据记录登录/注销事件以及一些元数据的Access数据库生成Fire Register报告(仍有多少人在建筑物内)。 Access DB如下所示:
+----+---------------------+---------+---------+------+ | id | date | action | success | user | +----+---------------------+---------+---------+------+ | 1 | 2009-04-28 02:00:00 | login | 1 | Nick | | 2 | 2009-04-28 03:00:00 | logout | 1 | Nick | | 3 | 2009-04-28 04:00:00 | login | 1 | Nick | | 4 | 2009-04-28 04:00:00 | logout | 1 | Nick | | 5 | 2009-04-28 04:00:00 | login | 1 | Nick | | 6 | 2009-04-28 07:00:00 | login | 1 | John | | 7 | 2009-04-28 07:30:00 | login | 1 | Sue | | 8 | 2009-04-28 08:00:00 | logout | 1 | John | +----+---------------------+---------+---------+------+
白天可以有多个登录/注销操作。
当管理员运行报告时,它仅限于当天,并且需要列出此用户的最后一次已知操作为login
且成功= 1的所有用户,这意味着此人当前在建筑物中。
在上面的数据中,必须指出 Nick 和 Sue 仍然在建筑物内。
答案 0 :(得分:1)
解决问题的另一种方法:
SELECT
T1.user
FROM
Some_Table T1
LEFT OUTER JOIN Some_Table T2 ON
T2.user = T1.user AND
T2.success = 1 AND
T2.date > T1.date
WHERE
T1.success = 1 AND
T1.action = 'login' AND
T2.id IS NULL
这假设您只关心成功的行动。此外,如果用户在相同的完整日期和时间上有两个操作,则它可能无法按预期运行。
答案 1 :(得分:0)
**原来
中的抱歉错误SELECT f.[User], la.MostRecent, f.[action]
FROM
(
SELECT
MAX(ID) AS MaXID,
MAX(Date) MostRecent,
success,
[USER]
FROM
Fire
WHERE
Success = 1
GROUP BY
success, [USER]
) AS la
JOIN Fire f
ON la.MaxID = f.ID
WHERE ([action] = 'login')
答案 2 :(得分:0)
这可以在SQL中使用,但您必须使用Access进行尝试。
select *
from events e1
where action = login
and success = 1
and date = (select max(date) from events e2 where e1.user = e2.user)
答案 3 :(得分:0)
这假设ID始终以正数递增并且是唯一的。
SELECT LogTable.*
FROM LogTable
INNER JOIN (Select User, Max(ID) AS LastID
FROM LogTable
GROUP BY LogTable.User
) as LastLog
ON LogTable.User = LastLog.User
AND LogTable.ID = LastLog.LastID
WHERE LogTable.success = 1 AND LogTable.action = 'login';
根据假设,您不必担心日期时间不唯一。
希望人们不习惯为没有登录的人敞开大门。