如何用SQL找出同一Session中plp紧随pdp的页面访问序列
SQL查找同一Session下pdp紧随plp的访问记录
问题描述
需要从页面访问数据中,筛选出同一SessionID内plp页面之后紧跟pdp页面的两组连续记录(即对应的plp和pdp条目)。
样例输入数据
| SessionID | Page Type |
|---|---|
| 123 | account |
| 123 | raw |
| 123 | plp |
| 123 | pdp |
| 123 | account |
| 123 | plp |
| 123 | sample |
| 123 | pdp |
| 123 | plp |
| 123 | pdp |
| 123 | raw |
期望输出
| SessionID | Page Type |
|---|---|
| 123 | plp |
| 123 | pdp |
| 123 | plp |
| 123 | pdp |
解决方案
利用SQL窗口函数LEAD()和LAG()识别连续的页面访问序列,筛选出符合条件的记录。
示例SQL代码
假设数据表名为page_visits,若有访问时间字段(如visit_time),请替换排序条件中的(SELECT NULL)以保证访问顺序准确:
WITH session_visit_seq AS ( SELECT SessionID, `Page Type`, -- 获取当前页面的下一个页面 LEAD(`Page Type`) OVER (PARTITION BY SessionID ORDER BY (SELECT NULL)) AS next_page, -- 获取当前页面的上一个页面 LAG(`Page Type`) OVER (PARTITION BY SessionID ORDER BY (SELECT NULL)) AS prev_page FROM page_visits ) SELECT SessionID, `Page Type` FROM session_visit_seq WHERE -- 筛选plp且下一个页面是pdp的记录 (`Page Type` = 'plp' AND next_page = 'pdp') -- 同时筛选pdp且上一个页面是plp的记录 OR (`Page Type` = 'pdp' AND prev_page = 'plp') ORDER BY SessionID;
说明
PARTITION BY SessionID确保只在同一个会话内分析页面序列ORDER BY子句必须基于实际的访问顺序字段(如时间戳),避免因数据库存储顺序导致的错误- 最终结果会按会话ID排序,保留原访问顺序中的连续plp-pdp对
内容的提问来源于stack exchange,提问作者dddela
相关产品推荐
相关产品推荐

