Создать отчет о пожаре - PullRequest
       15

Создать отчет о пожаре

0 голосов
/ 28 апреля 2009

Я застрял в поиске рабочего SQL-запроса для следующего:
Мне нужно сгенерировать отчет о пожарном регистре (сколько людей все еще находится внутри здания) на основе базы данных Access, которая записывает события входа / выхода из системы вместе с некоторыми метаданными. БД Access выглядит так:

+----+---------------------+---------+---------+------+
| 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 ]

1 голос
/ 28 апреля 2009

Еще один подход к проблеме:

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

Это предполагает, что вы заботитесь только об успешных действиях. Кроме того, если пользователь выполняет два действия в одну и ту же дату и время, тогда он может работать не так, как ожидается.

0 голосов
/ 28 апреля 2009

Предполагается, что идентификаторы всегда увеличиваются на положительное число и являются уникальными.

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

Исходя из предположения, вам не нужно беспокоиться о том, что дата и время не являются уникальными.

Надеюсь, что люди не имеют привычки держать дверь открытой для тех, кто не входит в систему.

0 голосов
/ 28 апреля 2009

Это будет работать в 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)
0 голосов
/ 28 апреля 2009

** извините за опечатку в оригинале

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')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...