下面从概念 → 典型用户行为分析场景 → SQL 示例 → 实践建议几个层面,系统性说明 Subquery(子查询)在用户行为分析中的应用。
子查询是指嵌套在 SELECT / FROM / WHERE / HAVING 中的查询语句,用于:
在用户行为分析中,常用于:
场景
找出“最近 7 天浏览过商品但未下单的用户”
SELECT user_id
FROM users
WHERE user_id IN (
SELECT user_id
FROM user_behavior
WHERE behavior_type = 'view'
AND event_date >= CURRENT_DATE - 7
)
AND user_id NOT IN (
SELECT user_id
FROM user_behavior
WHERE behavior_type = 'order'
AND event_date >= CURRENT_DATE - 7
);
✅ 子查询用于:
场景
找出“单次会话中点击次数 > 10 的用户”
SELECT user_id, click_count
FROM (
SELECT user_id,
COUNT(*) AS click_count
FROM user_behavior
WHERE behavior_type = 'click'
GROUP BY user_id, session_id
) t
WHERE click_count > 10;
✅ 子查询用于:
session 聚合场景
首次下单用户在 7 天后是否再次下单(复购)
SELECT COUNT(DISTINCT t1.user_id) AS first_buy_users,
COUNT(DISTINCT t2.user_id) AS repurchase_users
FROM (
SELECT user_id, MIN(event_date) AS first_buy_date
FROM user_behavior
WHERE behavior_type = 'order'
GROUP BY user_id
) t1
LEFT JOIN user_behavior t2
ON t1.user_id = t2.user_id
AND t2.behavior_type = 'order'
AND t2.event_date = t1.first_buy_date + 7;
✅ 子查询用于:
场景
分析“浏览 → 加购 → 下单”转化率
SELECT
(SELECT COUNT(DISTINCT user_id)
FROM user_behavior
WHERE behavior_type = 'view') AS view_users,
(SELECT COUNT(DISTINCT user_id)
FROM user_behavior
WHERE behavior_type = 'cart') AS cart_users,
(SELECT COUNT(DISTINCT user_id)
FROM user_behavior
WHERE behavior_type = 'order') AS order_users;
✅ 子查询用于:
场景
按最近一次下单时间给用户分“活跃 / 沉睡用户”
SELECT user_id,
CASE
WHEN days_since_last_order <= 7 THEN '活跃'
WHEN days_since_last_order <= 30 THEN '一般'
ELSE '沉睡'
END AS user_level
FROM (
SELECT user_id,
CURRENT_DATE - MAX(event_date) AS days_since_last_order
FROM user_behavior
WHERE behavior_type = 'order'
GROUP BY user_id
) t;
✅ 子查询用于:
场景
某运营活动前后,用户下单量变化
SELECT
(SELECT COUNT(*)
FROM user_behavior
WHERE behavior_type = 'order'
AND event_date BETWEEN '2024-06-01' AND '2024-06-07') AS before_cnt,
(SELECT COUNT(*)
FROM user_behavior
WHERE behavior_type = 'order'
AND event_date BETWEEN '2024-06-08' AND '2024-06-14') AS after_cnt;
✅ 子查询用于:
| 方式 | 适合场景 |
|---|---|
| Subquery | 简单筛选、聚合、临时性计算 |
| JOIN | 多表关联、复杂行为路径 |
| CTE(WITH) | 可读性要求高、逻辑复杂 |
✅ 现代 SQL 推荐:
当子查询层级过多时,使用 CTE 更易维护。
WITH first_order AS (
SELECT user_id, MIN(event_date) AS first_date
FROM user_behavior
WHERE behavior_type = 'order'
GROUP BY user_id
)
SELECT *
FROM first_order;
✅ 先聚合、后筛选
✅ 先定位用户、再分析行为
✅ 快速计算指标(留存、转化、复购)
✅ 减少重复扫描数据,提高可维护性
如果你愿意,我可以:
只要告诉我你的数据库类型和业务背景即可。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。