2009-04-28 9 views
0

Je suis coincé trouver une requête SQL de travail pour la mise en jachère:
J'ai besoin de générer un rapport de registre d'incendie (combien de personnes sont encore à l'intérieur du bâtiment) basé sur une base de données Access qui enregistre connexion/les événements de déconnexion avec certaines métadonnées. Le DB d'accès ressemble à ceci:Générer un rapport de registre d'incendie

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

Pendant la journée, il peut y avoir plusieurs connexion/actions dconnecter. Lorsque l'administrateur exécute le rapport, il est limité pour la journée en cours et doit répertorier tous les utilisateurs dont la dernière action connue pour cet utilisateur est login et success = 1, ce qui signifie que cette personne est actuellement dans le bâtiment.

Sur les données ci-dessus, Nick et Sue doit être signalé comme étant toujours à l'intérieur du bâtiment.

+0

Si elles ont une connexion réussie suivie d'un échec de connexion, devraient-ils être pris encore être à l'intérieur du bâtiment ? Il semble qu'ils devraient le faire, mais le libellé de votre question n'est pas clair à 100 p. –

Répondre

1

Une autre approche du problème:

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 

Cela suppose que vous ne vous préoccupez des actions réussies. En outre, si un utilisateur a deux actions à la même date et heure exacte, il risque de ne pas agir comme prévu.

0

faute de frappe désolé ** dans la

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

Cela fonctionnerait dans SQL, mais vous devez essayer avec 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

Cela suppose que les ID sont toujours incrémentés d'un nombre positif et sont uniques.

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

En supposant, vous n'avez pas à vous soucier d'une heure qui n'est pas unique.

personnes Hope ne sont pas l'habitude de tenir la porte ouverte pour d'autres qui ne se connectent pas.

Questions connexes