Как получить эту логику в SQL Query? - PullRequest
1 голос
/ 02 марта 2012

У меня есть две таблицы для отслеживания активности пользователя:

enter image description here

Мне нужно написать SQL-запрос для получения данных в формате ниже

: UserId | UserRole| LoginTime | LogOutTime

Примечание. LoginTime / LogOutTime - это Activity_Time_Stamp в таблице ActivityAuditTrail.Я не могу понять логику для этого.

Ответы [ 6 ]

1 голос
/ 02 марта 2012
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

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

1 голос
/ 02 марта 2012

Я не думаю, что вам нужен ваш стол активности.Этот запрос даст вам необходимую информацию, если пользователь вошел в систему и вышел из нее только один раз:

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

Конечно, этого недостаточно, поэтому вам понадобится способ сгруппировать вход с выходом из системы.Я предполагаю, что именно для этого поле 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

РЕДАКТИРОВАТЬ:

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
1 голос
/ 02 марта 2012

Попробуйте сгруппировать строки в маркер пользователя, роли и сеанса 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

Этот запрос даст вам метки времени входа и выхода для каждого сеанса пользователя.

1 голос
/ 02 марта 2012
;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

Пожалуйста, попробуйте это .. Поскольку у меня нет сценария схемы таблиц, не проверено Вы можете получить некоторые синтаксические ошибки. Пожалуйста, следуйте логике ..

0 голосов
/ 02 марта 2012

Как идентифицировать весь сеанс, я имею в виду, может быть, пользователь входил и выходил из системы несколько раз, как узнать, какой LogOut соответствует какому Login.

0 голосов
/ 02 марта 2012
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
...