首页/数据/数仓建模速查/会话化:超时切分会话
维度与事实设计149 条

会话化:超时切分会话

会话按同一用户相邻事件间隔超时(如 30 分钟)切分:用 lag 求间隔,累计切分标记后分组,得到会话号与会话度量。

数仓建模速查数据更新于 2026-10-13

会话化是什么

会话化把同一用户的相邻行为按静默时长切成一段段访问。阈值通常取 30 分钟,但真正的口径由业务定:内容型产品常用 30 分钟,交易型可能缩到 15 分钟。实现路径固定三步——先用窗口函数求相邻事件的间隔,标记出切分点,再累计求和得到会话序号,最后按会话聚合出时长、页数、入口页等度量。

基本信息

超时阈值常见 30 分钟,按业务与产品定
切分实现lag 求间隔,累计和生成会话号
分区依据按用户分区,按事件时间排序
产出度量会话时长、页数、入口页、出口页
跨天处理会话不被自然日切断

典型使用场景

  • 流量质量分析:会话数、会话时长比页面浏览更贴近真实访问
  • 转化漏斗:以会话为样本看从入口到下单的路径
  • 内容推荐:同一会话内的兴趣迁移比跨会话更可靠
  • 广告效果评估:落地页跳出率按会话口径计算
  • 客服工单归并:把同一用户短时间内的多次咨询并成一件事

会话切分

会话切分
WITH e AS (
  SELECT user_id, event_ts,
         lag(event_ts) OVER (PARTITION BY user_id ORDER BY event_ts) AS prev_ts
  FROM dwd_event
), s AS (
  SELECT user_id, event_ts,
         sum(CASE WHEN prev_ts IS NULL
                   OR unix_timestamp(event_ts) - unix_timestamp(prev_ts) >= 1800
                  THEN 1 ELSE 0 END)
           OVER (PARTITION BY user_id ORDER BY event_ts) AS session_seq
  FROM e
)
SELECT user_id, session_seq, min(event_ts) AS start_ts, max(event_ts) AS end_ts
FROM s GROUP BY user_id, session_seq;

输出逐列读法

列含义异常表现
prev_ts同一用户上一条事件时间首条为空的处理漏写会丢一个会话
session_seq会话序号,从 1 递增每次重跑序号变化说明排序不稳定
start_ts会话起点与结束时间相同说明只有一条事件
end_ts会话终点跨天会话被日期切断,指标双算
超时阈值是口径而不是实现细节:阈值从 30 分钟改成 15 分钟,会话数与人均会话时长都会变,同比数据不可比。阈值应作为参数写进会话表的分区或版本列,变更时保留旧版本结果。
同一用户事件量极大时按用户分区排序会形成热点。可行做法是先在近实时层按用户加小时预聚合,再在离线按完整时间范围重算边界——跨小时的相邻事件要用前一小时的末条事件补齐 prev_ts。

易错点

  • 超时阈值不统一:App 端与网页端各算各的,两边会话数不可比
  • 跨天会话被日期分区切断:一个会话被拆两段,会话数虚高
  • 边界判断用大于而不是大于等于:阈值落点事件归属不一致,两套代码结果不同
  • 只有首条无 prev_ts 的处理写漏:排在最前的事件不计入会话,会话起始时间整体后移
  • 忽略乱序事件:未按事件时间排序,间隔判断出现负值,切分点错乱

数据来源与参考

  • 流量分析实践:会话化算法
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌