2012-03-02 4 views
1

J'ai deux tables pour suivre l'activité des utilisateurs:Comment obtenir cette logique dans SQL Query?

enter image description here

Je dois écrire une requête SQL pour obtenir des données en dessous le format

: UserId | UserRole | LoginTime | LogOutTime

Remarque: LoginTime/LogOutTime est Activity_Time_Stamp dans la table ActivityAuditTrail. Je ne suis pas capable de trouver une logique pour cela.

+0

Ajout d'une nouvelle colonne User_Session dans la table Activity_Audit_Trail – AJ01

Répondre

1
SELECT User_Id, User_Role, Activity_Time_Stamp AS LoginTime, 
(SELECT Activity_Time_Stamp 
    FROM ActivityAuditTrail aud2 
    WHERE aud2.Activity_Id=2 
    AND ActivityAuditTrail.User_Id=aud2.User_Id 
    AND ActivityAuditTrail.User_Session=aud2.User_Session 
) AS LogOutTime 
FROM ActivityAuditTrail 
WHERE Activity_Id=1 

Je suis prudent et je suppose que les sessions ne sont pas uniques à un utilisateur, mais si elles le sont, vous pouvez omettre entièrement l'id_utilisateur du WHERE.

+0

Merci Ben, je l'avais déjà fait exactement de la même manière :) – AJ01

0
SELECT b.UserId, b.User_Role MIN(b.Activity_Time_Stamp) AS LoginTime, MAX(b.Activity_Time_Stamp) AS LogoutTime 
FROM `Activity` a 
    INNER JOIN `Activity Audit Trail` b ON a.Id = b.Activity_Id 
GROUP BY b.User_Id 
+0

Avez-vous compris la question? Ce qui est ci-dessus n'est pas ce que je veux – AJ01

+0

Oui, j'ai fait une requête correcte – dotoree

0

Comment identifier une session entière, je veux dire, peut-être un utilisateur ont connecté et déconnecté plusieurs fois, comment savoir qui LOGOUT match qui a Connexion.

+0

C'est une belle prise vraiment je n'ai pas pensé à cela. Lemme comprendre ce premier – AJ01

+0

Ajout d'une nouvelle colonne User_Session dans Activity_Audit_Trail table – AJ01

+0

Puis une autre question, dans cette logique, est la table d'activité nécessaire? – neorc

1
;with LoginTime AS(
SELECT User_Id, Activity_Time_Stamp 
    FROM Activity_Audit_Trail 
WHERE Activity_Id = 01 
),LogOutTime AS(
SELECT ROW_NUMBER() OVER(PARTITION BY a.User_Id ORDER BY Sa.User_Id, a.Activity_Time_Stamp DESC) AS RowNumber 
     a.User_Id, a.Activity_Time_Stamp AS LogOutTimeValue, li.Activity_Time_Stamp AS LoginTimeValue 
    FROM Activity_Audit_Trail a 
    JOIN LoginTime li 
    ON li.User_Id = a.User_Id 
WHERE Activity_Id = 02 
    AND a.Activity_Time_Stamp > li.Activity_Time_Stamp 
    ) 
    Select User_Id 
    ,User_Role 
    ,LoginTimeValue 
    ,LogOutTimeValue 
FROM LogOutTime 
WHERE RowNumber = 1 

S'il vous plaît essayer ceci .. Comme je n'ai pas de script de schéma de tables, pas testé. Vous pouvez obtenir des erreurs de syntaxe. S'il vous plaît suivre la logique ..

+0

L'éliminer mais obtenir une erreur – AJ01

+0

Syntaxe incorrecte près de "ROW_NUMBER", attendue "OVER". – AJ01

+0

ROW_NUMBER() OVER (PARTITION PAR a.User_Id ORDER BY Sa.User_Id, a.Activity_Time_Stamp DESC) Essayez de cette façon – Rajan

1

Essayez en groupant les lignes de l'utilisateur ActivityAuditTrail, le rôle et jeton de session, puis sélectionnez l'activité la plus élevée et horodatages comme la connexion et déconnexion respectivement horodatages:

SELECT User_Id, User_Role, MIN(Activity_Time_Stamp) AS LoginTime, CASE COUNT(*) WHEN 2 THEN MAX(Activity_Time_Stamp) ELSE NULL END AS LogOutTime 
FROM ActivityAuditTrail 
GROUP BY User_Id, User_Role, User_Session 

Cette requête vous obtiendrez les horodateurs de connexion et de déconnexion pour chaque session utilisateur.

+0

Merci Enrico, mais la requête ci-dessus n'est pas correcte.Où avez-vous pris en compte la table d'activité ActivityID doit être utilisé pour vérifier la connexion ou la déconnexion – AJ01

+0

@ AJ01 Dans ce cas, je suppose que la table 'ActivityAuditTrail' ne contiendra qu'une seule paire de * login/logout * par * utilisateur/rôle * à tout moment. Avec cette prémisse, il est prudent de supposer que l'horodatage le plus bas enregistré pour un utilisateur avec un rôle donné sera un * login *, alors que l'horodateur le plus élevé sera un * logout *. Si la table enregistre plusieurs événements de connexion/déconnexion pour le même utilisateur, ce que je soupçonne être le cas, nous avons besoin d'une information supplémentaire pour identifier de façon unique une session. –

+0

Ajout d'une nouvelle colonne User_Session dans la table Activity_Audit_Trail – AJ01

1

Je ne pense pas que vous ayez besoin de votre table d'activité. Cette requête vous donnera wat te dont vous avez besoin si l'utilisateur est connecté et hors du système qu'une seule fois:

Select AT.UserId. AT.UserRole, MIN(Activity_Time_Stamp) as LoginTime, MAX(Activity_Time_Stamp) as LogoutTime 
from ActivityAuditTrail AT 
group by AT.UserId. AT.UserRole 

bien sûr thats pas assez, alors vous aurez besoin d'un moyen de regrouper un login avec une fermeture de session. Je suppose que c'est ce que le champ Activity_ID est pour. Ainsi, chaque activité se compose de plusieurs pistes de vérification d'activité où les sapins est le login et le dernier est logout Dans ce cas, vous pouvez exécuter ceci:

Select AT.UserId. AT.UserRole, AT.Activity_ID, MIN(Activity_Time_Stamp) as LoginTime, MAX(Activity_Time_Stamp) as LogoutTime 
from ActivityAuditTrail AT 
group by AT.UserId. AT.UserRole, AT.Activity_ID 

EDIT:

select distinct AT.UserId, AT.UserRole, 
(select Activity_Time_Stamp from ActivityAuditTrail where UserId=AT.UserId and Activity_ID=1) as LoginTime, 
(select Activity_Time_Stamp from ActivityAuditTrail where UserId=AT.UserId and Activity_ID=2) as LogoutTime 
from ActivityAuditTrail AT 
+0

Ajout d'une nouvelle colonne User_Session dans Activity_Audit_Trail table – AJ01

+0

pour quoi l'utiliserez-vous? Contrôler le login \ logout? – Diego

+0

Je veux l'utiliser pour un rapport ... – AJ01