基于本文回答
0
评论

计算每个商品详情页的跳出率。定义为:用户进入该商品详情页后,未进行任何其他页面跳转(如加购、点击推荐、返回搜索等)便直接关闭了页面的会话占比

面试题:计算商品详情页的跳出率

1. 题目背景与定义

在电商数据分析中,跳出率(Bounce Rate) 是衡量商品详情页(Detail Page)吸引力和流量质量的重要指标。

  • 定义:用户进入该商品详情页(作为会话的首个页面/落地页 Landing Page)后,未进行任何其他页面跳转或互动(即该会话中仅有这一次详情页访问记录),便直接关闭了页面的会话占比。
  • 计算公式
    商品 P 的跳出率=以商品 P 详情页为起点且整个会话只有该条记录的会话数以商品 P 详情页为起点的总会话数\text{商品 P 的跳出率} = \frac{\text{以商品 P 详情页为起点且整个会话只有该条记录的会话数}}{\text{以商品 P 详情页为起点的总会话数}}

2. 示例数据

用户行为日志表 user_behavior_log

session_id user_id page_name product_id action_time
S001 U01 detail P1001 2023-10-27 10:00:00
S002 U02 detail P1001 2023-10-27 10:05:00
S002 U02 cart P1001 2023-10-27 10:06:00
S003 U03 detail P1001 2023-10-27 10:10:00
S004 U04 search NULL 2023-10-27 10:15:00
S004 U04 detail P1001 2023-10-27 10:16:00
S005 U05 detail P1002 2023-10-27 10:20:00
S006 U06 detail P1002 2023-10-27 10:30:00
S006 U06 detail P1001 2023-10-27 10:31:00

3. 期望输出结果

product_id entry_sessions bounce_sessions bounce_rate
P1001 3 2 66.67%
P1002 2 1 50.00%

数据解析说明

  • P1001 共有 3 个会话以它为落地页(S001, S002, S003)。其中 S001 和 S003 均只有 1 条记录(跳出),S002 后面加购了。S004 的起点是 search 页面,故不计入 P1001 的落地会话。跳出率 = 2 / 3 = 66.67%。
  • P1002 共有 2 个会话以它为落地页(S005, S006)。其中 S005 只有 1 条记录(跳出),S006 后面跳转到了 P1001 详情页。跳出率 = 1 / 2 = 50.00%。

4. SQL 解答

sql
WITH session_analysis AS (
    SELECT
        session_id,
        page_name,
        product_id,
        -- 标示每个会话内页面的访问顺序
        ROW_NUMBER() OVER(PARTITION BY session_id ORDER BY action_time) as step_no,
        -- 计算每个会话内的总操作步骤数
        COUNT(1) OVER(PARTITION BY session_id) as total_steps
    FROM user_behavior_log
),
landing_sessions AS (
    SELECT
        product_id,
        session_id,
        -- 如果总步骤数为1,则视为跳出(Bounce)
        CASE WHEN total_steps = 1 THEN 1 ELSE 0 END as is_bounce
    FROM session_analysis
    -- 过滤出:会话的第一步(Landing Page)且必须是商品详情页
    WHERE step_no = 1 AND page_name = 'detail'
)
SELECT
    product_id,
    COUNT(session_id) as entry_sessions,
    SUM(is_bounce) as bounce_sessions,
    CONCAT(ROUND(SUM(is_bounce) * 100.0 / COUNT(session_id), 2), '%') as bounce_rate
FROM landing_sessions
GROUP BY product_id
ORDER BY product_id;

5. SQL 分析与面试考点应对

此题是互联网电商及数据分析岗位高频出现的“漏斗分析 / 路径分析”演变题。面试官主要考察以下几个核心能力:

① 窗口函数的组合应用(核心考点)

  • ROW_NUMBER():用于对每个 session_id 内的行为按时间排序,从而精准锁定 "落地页"(第一步,step_no = 1
  • COUNT(1) OVER(PARTITION BY ...):直接在当前层获取到该会话的总事件数(total_steps)。这种通过窗口函数在同一层级内既拿到“序号”又拿到“总量”的做法,比先 GROUP BYJOIN 的性能好得多,是 SQL 优化的加分项。

② 业务逻辑的边界定义

在面试中,主动向面试官确认定义能展现极佳的职业素养:

  • 什么是“跳出”?:必须是第一个页面是详情页,且整个会话只有这一个页面
  • 如果用户通过搜索(Search)进入详情页,然后关闭,算不算该详情页的跳出?按照行业标准,这属于搜索页的延续,不属于详情页的 Landing Page。本套 SQL 方案通过 WHERE step_no = 1 AND page_name = 'detail' 严格排除了这种情况。

③ 易错点提示

  • 数据类型转换:在计算百分比时,很多数据库中 INT / INT 会直接得到 0。SQL 中使用 * 100.0 可以自动将分子转换为浮点数,避免精度丢失。
  • 聚合函数安全:使用 SUM(is_bounce) 累加跳出会话,COUNT(session_id) 计算总落地会话,最后用 GROUP BY product_id 呈现每个商品的指标。
右滑查看面试常问