You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Athena中基于logon页面分组生成会话ID?

在Athena中基于logon页面划分会话并生成新ID

要实现按logon页面划分会话(每个会话从logon开始到下一个logon前结束),核心是用累积求和标记每个访问所属的会话,而非按页面单独计数。以下是修正后的SQL:

SELECT
  id,
  page_name,
  visited_time,
  -- 计算当前访问所属的会话编号:每遇到logon页面,会话数+1,后续页面继承该编号
  SUM(CASE WHEN page_name = 'logon' THEN 1 ELSE 0 END) OVER (
    PARTITION BY id 
    ORDER BY visited_time 
    ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
  ) AS session_count,
  -- 拼接生成新ID
  CONCAT(id, '-', 
    SUM(CASE WHEN page_name = 'logon' THEN 1 ELSE 0 END) OVER (
      PARTITION BY id 
      ORDER BY visited_time 
      ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
    )
  ) AS new_id
FROM your_table_name
ORDER BY id, visited_time;

逻辑说明:

  • PARTITION BY id:按用户id分组,确保每个用户的会话独立计数
  • ORDER BY visited_time:按访问时间排序,保证会话顺序正确
  • SUM(CASE...) OVER(...):遍历用户的访问记录,每遇到page_name='logon'就累加1,后续所有非logon页面都会继承这个累加值,直到下一个logon出现时会话数再加1
  • CONCAT(id, '-', session_count):直接拼接用户id和会话编号得到new_id,无需使用复杂的聚合函数

执行结果:

运行上述SQL后,会得到你期望的输出:

idpage_namevisited_timesession_countnew_id
ABC-123logon2023-02-23 04:04:40.0001ABC-123-1
ABC-123smscode2023-02-23 04:20:40.0001ABC-123-1
ABC-123acct balance2023-02-23 04:21:40.0001ABC-123-1
ABC-123logon2023-02-23 04:54:40.0002ABC-123-2
ABC-123transfer2023-02-23 04:54:40.0002ABC-123-2
CDE-123logon2023-02-23 04:58:40.0001CDE-123-1

内容的提问来源于stack exchange,提问作者vvazza

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 22:57:20