如何在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出现时会话数再加1CONCAT(id, '-', session_count):直接拼接用户id和会话编号得到new_id,无需使用复杂的聚合函数
执行结果:
运行上述SQL后,会得到你期望的输出:
| id | page_name | visited_time | session_count | new_id |
|---|---|---|---|---|
| ABC-123 | logon | 2023-02-23 04:04:40.000 | 1 | ABC-123-1 |
| ABC-123 | smscode | 2023-02-23 04:20:40.000 | 1 | ABC-123-1 |
| ABC-123 | acct balance | 2023-02-23 04:21:40.000 | 1 | ABC-123-1 |
| ABC-123 | logon | 2023-02-23 04:54:40.000 | 2 | ABC-123-2 |
| ABC-123 | transfer | 2023-02-23 04:54:40.000 | 2 | ABC-123-2 |
| CDE-123 | logon | 2023-02-23 04:58:40.000 | 1 | CDE-123-1 |
内容的提问来源于stack exchange,提问作者vvazza
相关产品推荐
相关产品推荐

