生成Fire Register报告

时间:2009-04-28 15:23:04

标签: sql database ms-access

我很难找到一个正常工作的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 仍然在建筑物内。

4 个答案:

答案 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';

根据假设,您不必担心日期时间不唯一。

希望人们不习惯为没有登录的人敞开大门。