SQL实现中断序列关联的用户浏览会话StartId生成问题
实现用户连续浏览同文件的会话起始ID计算
问题根源
你之前使用FIRST_VALUE(Id) OVER (PARTITION BY User, File ORDER BY Id)的逻辑是将同一个用户访问同一个文件的所有记录都归为同一组,没有区分「中途切换其他文件后再返回」的场景,因此会出现Id=7的StartId错误计算为1的问题。
实现逻辑
我们需要先识别同一个用户连续访问同一个文件的会话组,再基于会话组计算起始ID,步骤如下:
- 对每个用户的操作按ID升序排序,对比当前行和上一行访问的文件是否相同,不同则标记为新会话断点
- 对断点标记做累加求和,得到每个用户内部唯一的会话编号,同一个连续访问同文件的操作会被分到同一个会话
- 按用户+会话编号分区,取分区内最小的ID作为当前会话的StartId
可运行SQL代码
WITH mark_session_break AS ( SELECT *, -- 新会话断点标记:上一个访问的文件和当前不同/是用户第一条操作时记为1,否则0 CASE WHEN File = LAG(File) OVER(PARTITION BY User ORDER BY Id) THEN 0 ELSE 1 END AS is_new_session FROM 你的日志表名 ), calc_session_id AS ( SELECT *, -- 累加断点得到用户内唯一会话ID SUM(is_new_session) OVER(PARTITION BY User ORDER BY Id) AS user_session_id FROM mark_session_break ) SELECT Id, User, File, FIRST_VALUE(Id) OVER(PARTITION BY User, user_session_id ORDER BY Id) AS StartId FROM calc_session_id ORDER BY Id;
效果验证
代入你的示例数据计算时,用户A的Id=7操作属于切换到Y之后再次返回X的新会话,会被分配独立的user_session_id,最终计算得到的StartId为7,完全符合预期。
内容的提问来源于stack exchange,提问作者vvandel_nfir
相关产品推荐
相关产品推荐

