04 | 用户行为轨迹分析


目录

一、问题定义与业务场景

二、数据准备与建表语句

2.1 建表语句

2.2 样例数据

2.3 数据关系说明

三、SQL解决方案(两种主流方法)

3.1 窗口函数法(验证相邻行为)

3.2 行为序列拼接法(验证非连续路径)

四、扩展优化与边界处理

4.1 关键边界场景

4.2 性能优化方案

4.3 高级变体问题

五、总结与面试要点


一、问题定义与业务场景

目标:分析用户在应用内的连续行为序列(如页面浏览、功能点击),识别特定行为路径模式(如“A→B→C”)。
核心需求

  1. 相邻行为验证:统计完成相邻动作的用户(如签到后立刻抽奖)。
  2. 非连续路径匹配:识别行为序列中存在中间步骤的路径(如A→任意页面→B→非C页面→D)。

应用场景

  • 漏斗转化分析(如购物车→支付流程)
  • 用户流失点定位(如注册后未完成新手引导)
  • 运营活动效果追踪(如优惠券领取→使用路径)

二、数据准备与建表语句

2.1 建表语句

CREATE TABLE user_behavior_log (
    user_id BIGINT COMMENT '用户ID',
    action_id VARCHAR(128) COMMENT '行为标识(如sign/lottery)',
    event_time DATETIME COMMENT '行为时间'
) COMMENT '用户行为日志表'; 

2.2 样例数据

INSERT INTO user_behavior_log VALUES
(1001, 'login', '2025-06-01 09:00:00'),
(1001, 'sign', '2025-06-01 09:01:00'),  -- 签到
(1001, 'lottery', '2025-06-01 09:01:30'),  -- 抽奖(与签到相邻)
(1001, 'view_product', '2025-06-01 09:02:00'),
(1002, 'sign', '2025-06-01 10:00:00'),
(1002, 'view_ad', '2025-06-01 10:00:30'),  -- 中间行为
(1002, 'lottery', '2025-06-01 10:01:00'),  -- 非相邻抽奖
(1003, 'sign', '2025-06-01 11:00:00'),
(1003, 'lottery', '2025-06-01 11:00:05');  -- 相邻抽奖

2.3 数据关系说明

用户

行为序列

是否符合相邻路径(sign→lottery)

1001

login → sign → lottery

✅(间隔30秒)

1002

sign → view_ad → lottery

❌(存在中间行为)

1003

sign → lottery

✅(间隔5秒)


三、SQL解决方案(两种主流方法)

3.1 窗口函数法(验证相邻行为)

适用场景:检测连续两个行为是否相邻(如签到后立刻抽奖)。
核心逻辑

  1. 使用LEAD()获取下一个行为
  2. 筛选当前行为为sign且下一行为lottery的用户数
SELECT 
    COUNT(DISTINCT user_id) AS user_count
FROM (
    SELECT 
        user_id,
        action_id,
        LEAD(action_id, 1) OVER ( PARTITION BY user_id ORDER BY event_time ) AS next_action
    FROM user_behavior_log
) t
WHERE action_id = 'sign' AND next_action = 'lottery';

执行结果

3.2 行为序列拼接法(验证非连续路径)

适用场景:识别复杂路径(如A→B→D且中间不含C)的用户数。
核心逻辑

  1. 按时间排序拼接行为序列
  2. 用正则匹配路径模式
WITH behavior_sequence AS (
    SELECT 
        user_id,
        GROUP_CONCAT(action_id ORDER BY event_time) AS action_path
    FROM user_behavior_log
    GROUP BY user_id
)
SELECT 
    COUNT(*) AS user_count
FROM behavior_sequence
WHERE 
    -- 匹配A-B-D路径,且B-D之间不含C
    action_path REGEXP '.*sign,.*lottery.*,view_product.*' 
    AND action_path NOT LIKE '.*sign,.*C,.*view_product.*';  

执行结果

分组统计明细:


四、扩展优化与边界处理

4.1 关键边界场景

  • 相同时间行为
ORDER BY event_time, action_id  -- 时间相同时按行为ID排序

4.2 性能优化方案

  • 数据倾斜处理(用户行为量差异大)
  • 索引设计(MySQL/PostgreSQL):
CREATE INDEX idx_user_time ON user_behavior_log(user_id, event_time);

4.3 高级变体问题

  • 使用正则的路径匹配(如A后出现B但跳过C):
action_path RLIKE 'A((?!C).)*B'  -- 匹配A到B之间无C
  • 循环行为检测(如A→B→A):
action_path LIKE '%A,B,A%'  -- 简单循环模式

五、总结与面试要点

  1. 核心方法对比

方法

适用场景

时间复杂度

优势

窗口函数(LEAD)

相邻行为验证

O(n log n)

代码简洁

行为序列拼接

复杂路径匹配

O(n²)

支持非连续路径

1.高频考点

  • 时间乱序处理:ORDER BY event_time确保序列顺序
  • 去重机制:GROUP_CONCAT、COLLECT_LIST需搭配排序避免乱序
  • 分区策略:按日期分区提升查询性能

2.避坑指南

  • 空值处理:LEAD()可能返回NULL,需用COALESCE
  • 性能陷阱:避免对未分区的大表全扫描

3.真题参考

腾讯、拼多多等大厂高频题型,扩展题包括“用户行为漏斗转化率分析”、“关键路径流失用户定位”。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

走过冬季

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值