我有一个带有以下结构的SQL表
Timestamp(DATETIME)|AuditEvent
---------|----------
T1|Login
T2|LogOff
T3|Login
T4|Execute
T5|LogOff
T6|Login
T7|Login
T8|Report
T9|LogOff
想要以T-SQL的方式找出用户登录系统的时间,即某一天内每个会话的登录时间和注销时间之间的时间。
Day (Date)|UserTime(In Hours) (Logoff Time - LogIn Time)
--------- | -------
Jun 12 | 2
Jun 12 | 3
Jun 13 | 5
我尝试使用两个临时表和行号,但无法得到它,因为比较是一个时间,即找出时间戳大于当前行的登录事件的下一个Logout事件。
答案 0 :(得分:1)
您需要对记录进行分组。我建议计算登录或注销。这是为每个“会话”获取时间的一种方法:
select min(case when auditevent = 'login' then timestamp end) as login_time,
max(timestamp) as logoff_time
from (select t.*,
sum(case when auditevent = 'logoff' then 1 else 0 end) over (order by timestamp desc) as grp
from t
) t
group by grp;
然后你必须做你想做的任何事情来获得每天的数字。目前还不清楚这些重要性是什么。
子查询执行反向计数。它计算每条记录或之后出现的“注销”记录的数量。对于同一“会话”中的记录,此计数相同,适合分组。