SQL Query根据条件在Table的下一行或后续行中查找Sequence

时间:2017-06-21 19:08:44

标签: sql sql-server

我有一个带有以下结构的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事件。

1 个答案:

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

然后你必须做你想做的任何事情来获得每天的数字。目前还不清楚这些重要性是什么。

子查询执行反向计数。它计算每条记录或之后出现的“注销”记录的数量。对于同一“会话”中的记录,此计数相同,适合分组。