【问题标题】:Generate a Fire Register report生成火灾登记报告
【发布时间】:2009-04-28 15:23:03
【问题描述】:

我一直在为休耕找出一个有效的 SQL 查询:
我需要根据记录登录/注销事件以及一些元数据的 Access 数据库生成火灾登记报告(建筑物内仍有多少人)。 Access DB 如下所示:

+----+---------+---------+---------+-- ----+ |编号 |日期 |行动 |成功|用户 | +----+---------+---------+---------+-- ----+ | 1 | 2009-04-28 02:00:00 |登录 | 1 |尼克 | | 2 | 2009-04-28 03:00:00 |登出 | 1 |尼克 | | 3 | 2009-04-28 04:00:00 |登录 | 1 |尼克 | | 4 | 2009-04-28 04:00:00 |登出 | 1 |尼克 | | 5 | 2009-04-28 04:00:00 |登录 | 1 |尼克 | | 6 | 2009-04-28 07:00:00 |登录 | 1 |约翰 | | 7 | 2009-04-28 07:30:00 |登录 | 1 |苏 | | 8 | 2009-04-28 08:00:00 |登出 | 1 |约翰 | +----+---------+---------+---------+-- ----+

白天可以有多个登录/注销操作。 当管理员运行报告时,它仅限于当天,并且需要列出该用户的最后一次已知操作为login 并且success=1 的所有用户,这意味着此人当前在建筑物中。

根据上述数据,必须指出 NickSue 仍在建筑物内。

【问题讨论】:

  • 如果他们登录成功后又登录失败,是否仍应假定他们在建筑物内?看起来他们应该这样做,但你的问题的措辞并不是 100% 清楚。

标签: sql database ms-access


【解决方案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

这假设您只关心成功的操作。此外,如果用户在相同的确切日期和时间执行两项操作,则它可能不会按预期执行。

【讨论】:

    【解决方案2】:

    这可以在 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】:

      **抱歉原文有错别字

      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')
      

      【讨论】:

        【解决方案4】:

        这假设 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';
        

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

        希望大家不要养成为不登录的人开门的习惯。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-10-10
          • 2011-03-02
          • 2023-03-21
          • 2011-04-21
          • 1970-01-01
          • 2014-10-11
          • 1970-01-01
          相关资源
          最近更新 更多