基于SQL Rank窗口按条件统计行数:统计各session_id支付步骤前访问的Essay URL数量
解决方案:统计支付步骤前的Essay访问数量
没问题,我来帮你搞定这个统计需求!要算出每个session在进入/payment_processing(支付步骤)前访问过的Essay类页面数量,用SQL就能轻松实现,我给你拆解下思路和代码:
核心思路
- 先定位每个session中第一次访问支付页面的顺序(rank)——因为如果一个session多次进入支付步骤,我们只需要统计第一次支付前的访问记录;
- 筛选出每个session中,访问顺序在第一次支付步骤之前,且URL路径以
/essay/开头的记录; - 按session分组,统计这些符合条件的记录数量。
完整SQL代码
-- 先获取每个session第一次访问支付页面的rank WITH first_payment_rank AS ( SELECT session_id, MIN(rank) AS first_payment_rank FROM your_table_name -- 替换成你的实际表名 WHERE url_path = '/payment_processing' GROUP BY session_id ) -- 统计每个session在第一次支付前的Essay页面数量 SELECT t.session_id, COUNT(t.url_path) AS essay_count_before_payment FROM your_table_name t JOIN first_payment_rank pr ON t.session_id = pr.session_id WHERE t.rank < pr.first_payment_rank AND t.url_path LIKE '/essay/%' GROUP BY t.session_id ORDER BY t.session_id;
代码解释
first_payment_rank这个CTE(公共表表达式)专门用来抓取每个session第一次进入支付页面的顺序值,用MIN(rank)确保我们取的是最早的支付步骤;- 主查询把原表和这个CTE通过
session_id关联,筛选出rank小于支付步骤rank、同时URL符合Essay路径规则的记录; - 最后用
COUNT()和GROUP BY session_id得到每个session的统计结果。
验证示例数据
把你的示例数据代入这个代码:
- session 001的第一次支付rank是6,之前只有
/essay/e1(rank5)符合条件,所以计数为1; - session 002的第一次支付rank是9,之前有
/essay/e3(rank7)和/essay/e4(rank8)符合条件,所以计数为2;
完全匹配你期望的输出结果。
内容的提问来源于stack exchange,提问作者Sanath Sastry
相关产品推荐
相关产品推荐

