私は、ユーザーのアクティビティを追跡するには、2つのテーブルがあります。SQLクエリでこのロジックを取得するには?
私はフォーマット以下
にデータを取得するために、SQLクエリを記述する必要があります。 ユーザーID |のUserRole | LoginTime | LogOutTime
を注:LoginTime/LogOutTimeはActivityAuditTrailテーブルのActivity_Time_Stampです。私はこれについての論理を理解することができません。
私は、ユーザーのアクティビティを追跡するには、2つのテーブルがあります。SQLクエリでこのロジックを取得するには?
私はフォーマット以下
にデータを取得するために、SQLクエリを記述する必要があります。 ユーザーID |のUserRole | LoginTime | LogOutTime
を注:LoginTime/LogOutTimeはActivityAuditTrailテーブルのActivity_Time_Stampです。私はこれについての論理を理解することができません。
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を除外することができます。
ありがとうございました。私はすでにまったく同じようにしています:) – AJ01
;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
ユーザー、役割とセッショントークンの行をグループ化することによって
てみてください。..ロジックに従った後、それぞれのログインとログアウトのタイムスタンプとして最低と最高の活動のタイムスタンプを選択してください:
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
このクエリ各ユーザーセッションのログインとログアウトのタイムスタンプを取得します。
Enricoありがとうございますが、上記のクエリは正しくありません。アクティビティテーブルActivityIDを考慮して、ログインまたはログアウトを確認する必要があります – AJ01
@ AJ01この場合、私は 'ActivityAuditTrail'テーブルに*ログイン/ログアウト*ユーザー/ロール*を指定します。この前提では、与えられた役割を持つユーザーのために記録された最低のタイムスタンプは* login *であり、最高のタイムスタンプは* logout *であると仮定することは安全です。同じユーザーの複数のログイン/ログアウトイベントがテーブルに記録されている場合は、セッションを一意に識別するために追加の情報が必要です。 –
Activity_Audit_Trailテーブルに新しい列User_Sessionを追加しました – AJ01
私はあなたのアクティビティテーブルが必要だと思いません。 このクエリは与えるあなたはあなたユーザーが一度だけのシステムからログアウトした場合に必要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
Activity_Audit_Trailテーブルに新しい列User_Sessionを追加しました – AJ01