代码之家  ›  专栏  ›  技术社区  ›  duckyflip

生成火灾登记报告

  •  0
  • duckyflip  · 技术社区  · 15 年前

    我一直在为fallowing计算一个有效的SQL查询:
    我需要基于一个记录登录/注销事件和一些元数据的访问数据库生成一个火灾登记报告(建筑物内还有多少人)。 访问数据库如下所示:

    +----+---------------------+---------+---------+------+
    | 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 而success=1,表示此人目前在大楼中。

    根据以上数据, 尼克 必须指出仍在建筑物内。

    4 回复  |  直到 15 年前
        1
  •  1
  •   Tom H zenazn    15 年前

    解决问题的另一种方法:

    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
  •  0
  •   tvanfosson    15 年前

    这在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
  •   Eoin Campbell    15 年前

    **抱歉,原文中有错别字。

    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
  •  0
  •   JeffO    15 年前

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

    基于假设,您不必担心日期时间不唯一。

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