首页 > 解决方案 > sql中的会话时间计算

问题描述

我在 mysql 中有一个包含两列的事件表:UserId、EventTime(datetime)。我需要为每个 UserId 计算两件事:

  1. 会话数
  2. 会话长度总和

会话结束由 2 分钟定义为该用户没有事件。

我该如何编写这样的查询?

例如,对于附加图像中的该用户,会话数为 2,会话长度总和为 2 分 34 秒

在此处输入图像描述

标签: mysqlsql

解决方案


这是 MySQL 的一个痛点。一种方法使用相关子查询来识别开始,然后使用变量来为会话分配一个数字:

select e.*,
       (@s := if(@u <> userid or eventtime > prev_et + interval 2 minute, @s + 1
                 if(@u := userid, @s, @s)
                )
       ) as session_id
from (select e.*,
             (select max(e2.eventtime) from events e2 where e2.userid = e.userid and e2.eventtime < e.eventtime
             ) as prev_et
      from events e
      order by userid, eventtime
     ) e cross join
     (select @u := 1, @s := 0) params;

推荐阅读