2012-03-02 5 views
1

私は、ユーザーのアクティビティを追跡するには、2つのテーブルがあります。SQLクエリでこのロジックを取得するには?

enter image description here

私はフォーマット以下

にデータを取得するために、SQLクエリを記述する必要があります。 ユーザーID |のUserRole | LoginTime | LogOutTime

を注:LoginTime/LogOutTimeはActivityAuditTrailテーブルのActivity_Time_Stampです。私はこれについての論理を理解することができません。

+0

Activity_Audit_Trailテーブルに新しい列User_Sessionを追加しました – AJ01

答えて

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 

私は安全面にあり、セッションはユーザーに固有のものではないと仮定していますが、もしそうであれば、WHEREからuser_idを除外することができます。

+0

ありがとうございました。私はすでにまったく同じようにしています:) – 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

質問が分かりましたか?上記は私が欲しいものではない – AJ01

+0

はい、私は正しい質問をしました – dotoree

0

ユーザーがログインして何度もログアウトしたかどうか、どのログアウトがどのログインに一致するかを知る方法。

+0

これは本当に私はこれを考えていない素晴らしいキャッチです。 Lemmeが最初にこれを見つけ出す – AJ01

+0

Activity_Audit_TrailテーブルにUser_Sessionという新しい列が追加されました – AJ01

+0

このロジックでは、別の質問が必要ですか? – 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 

私はテーブルのスキーマスクリプトを持っていないので、テストされていません。構文エラーが発生することがあります。 ActivityAuditTrailユーザー、役割とセッショントークンの行をグループ化することによって

+0

試してみましたが、エラーが発生しました – AJ01

+0

'ROW_NUMBER'の近くに構文が正しくない、 'OVER'が予想されます。 – AJ01

+0

ROW_NUMBER()OVER(PARTITION BY a.User_Id ORDER BY Sa.User_Id、a.Activity_Time_Stamp DESC)このようにしてください – Rajan

1

てみてください。..ロジックに従った後、それぞれのログインとログアウトのタイムスタンプとして最低と最高の活動のタイムスタンプを選択してください:

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 

このクエリ各ユーザーセッションのログインとログアウトのタイムスタンプを取得します。

+0

Enricoありがとうございますが、上記のクエリは正しくありません。アクティビティテーブルActivityIDを考慮して、ログインまたはログアウトを確認する必要があります – AJ01

+0

@ AJ01この場合、私は 'ActivityAuditTrail'テーブルに*ログイン/ログアウト*ユーザー/ロール*を指定します。この前提では、与えられた役割を持つユーザーのために記録された最低のタイムスタンプは* login *であり、最高のタイムスタンプは* logout *であると仮定することは安全です。同じユーザーの複数のログイン/ログアウトイベントがテーブルに記録されている場合は、セッションを一意に識別するために追加の情報が必要です。 –

+0

Activity_Audit_Trailテーブルに新しい列User_Sessionを追加しました – AJ01

1

私はあなたのアクティビティテーブルが必要だと思いません。 このクエリは与えるあなたはあなたユーザーが一度だけのシステムからログアウトした場合に必要WAT:もちろん

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 

が十分ではないthatsの、そうyoullのグループにログアウトして、ログインを方法が必要です。 私は、Activity_IDフィールドが何であるかと考えています。だから、それぞれの活動をもみがログインされ、最後はあなたがこれを実行することができ、その場合には、ログアウト あるいくつかのアクティビティの監査証跡で構成されています

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

Activity_Audit_Trailテーブル – AJ01

+0

に新しい列User_Sessionを追加しました。ログイン\ログアウトを制御しますか? – Diego

+0

私はレポートのためにそれを使用したいと思っています... – AJ01