如何在SQL查询中获取此逻辑?

如何在SQL查询中获取此逻辑?,sql,join,login,self,Sql,Join,Login,Self,我有两个表来跟踪用户活动: 我需要编写一个SQL查询来获取以下格式的数据 : 用户ID |用户角色|登录时间|登录时间 注意:LoginTime/LogOutTime是ActivityAuditTrail表中的Activity_Time_标记。我想不出这个逻辑。如何识别整个会话,我的意思是,可能一个用户登录和注销了好几次,如何知道哪个注销与哪个登录匹配。如何识别整个会话,我的意思是,可能一个用户登录和注销了好几次,如何知道哪个注销与哪个登录匹配 SELECT b.UserId, b.User_

我有两个表来跟踪用户活动:

我需要编写一个SQL查询来获取以下格式的数据

: 用户ID |用户角色|登录时间|登录时间


注意:LoginTime/LogOutTime是ActivityAuditTrail表中的Activity_Time_标记。我想不出这个逻辑。

如何识别整个会话,我的意思是,可能一个用户登录和注销了好几次,如何知道哪个注销与哪个登录匹配。

如何识别整个会话,我的意思是,可能一个用户登录和注销了好几次,如何知道哪个注销与哪个登录匹配

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

此查询将获取每个用户会话的登录和注销时间戳。

尝试将
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

此查询将获得每个用户会话的登录和注销时间戳。

我认为您不需要活动表。 如果用户仅登录和退出系统一次,此查询将为您提供所需的信息:

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
当然,这还不够,所以您需要一种将登录和注销分组的方法。 我想这就是“活动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 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
当然,这还不够,所以您需要一种将登录和注销分组的方法。 我想这就是“活动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
编辑:

为了安全起见,我假设会话不是用户独有的,但如果是,您可以完全从WHERE中省略用户id



为了安全起见,我假设会话不是用户独有的,但如果是,您可以将用户id完全从WHERE中删除。

您理解这个问题吗?以上不是我想要的你明白这个问题了吗?以上不是我想要的,这是一个伟大的收获,真的,我没有想到这一点。让我弄明白这一点,首先在活动审计跟踪表中添加了一个新的列User\u Session,然后在这个逻辑中,还有一个问题,活动表是必要的吗?这是一个很好的发现,我真的没有想到这一点。让我先在活动审计跟踪表中添加一个新的列User\u Session然后再问另一个问题,在这个逻辑中,活动表是必要的吗?谢谢Enrico,但是上面的查询不正确。您在哪里考虑过活动表ActivityID需要用于检查登录或Logout@AJ01在本例中,我假设
ActivityAuditTrail
表在任何给定时间都只包含每个用户/角色的一对登录/注销行。在这个前提下,可以安全地假设为具有给定角色的用户记录的最低时间戳是登录,而最高时间戳是注销。如果该表记录了同一用户的多个登录/注销事件(我怀疑是这样),那么我们需要一条额外的信息来唯一标识会话。在Activity_Audit_Trail中添加了一个新的列user_sessiontable@AJ01凉的现在我们可以在分组中包含会话令牌,我们将获得每个用户会话的登录/注销时间戳。我更新了我的答案。嘿,Enrico,尝试了你的查询,但没有给出想要的结果。我想要的是,当用户登录ie ActivityId=1时,ActivityTimestamp会在此时更新,注销时间将为空,因此当用户注销ie ActivityId=2时,Logut列中的Actvitytime戳将为空。谢谢Enrico,但是上面的查询不正确。您在哪里考虑过活动表ActivityID需要用于检查登录或Logout@AJ01在本例中,我假设
ActivityAuditTrail
表在任何给定时间都只包含每个用户/角色的一对登录/注销行。在这个前提下,可以安全地假设为具有给定角色的用户记录的最低时间戳是登录,而最高时间戳是注销。如果该表记录了同一用户的多个登录/注销事件(我怀疑是这样),那么我们需要一条额外的信息来唯一标识会话。在Activity_Audit_Trail中添加了一个新的列user_sessiontable@AJ01凉的现在我们可以在分组中包含会话令牌,我们将获得每个用户会话的登录/注销时间戳。我更新了我的答案。嘿,Enrico,尝试了你的查询,但没有给出想要的结果。我想要的是当用户登录ie ActivityId=1时,ActivityTimestamp会在此时更新,注销时间将为空,因此当用户注销ie ActivityId=2时,Logut列中的Actvitytime戳记。ROW_NUMBER()结束(按a.user_Id分区按Sa.user_Id排序,a.Activity_time_戳记说明)尝试此方法ROW_NUMBER()结束(按a.User\u Id按Sa.User\u Id、a.Activity\u Time\u Stamp DESC进行分区)尝试此方法在“活动”中添加了一个新的列用户会话在“活动”中添加了一个新的列用户会话在“活动”中添加了一个新的列用户会话在“活动”中添加了一个新的列用户会话在“审计”中使用什么