通过真实业务数据,练习产品分析 SQL。
SQL 课程 X:产品分析 SQL 实战
这一课不再单独讲一个新语法,而是把前面学过的能力放在一起,完成一组更接近真实工作的产品分析任务。你需要先理解业务问题,再决定查哪张表、如何关联、怎样定义指标。
实战数据来自 accounts 客户档案和 sales_pipeline 商机记录。你会分析客户价值、产品成交表现、客户最近行为和销售人员排名。每道题都对应一个产品经理可能拿去做周报、复盘或需求判断的问题。
写综合 SQL 时,可以先在脑中拆成几步:准备明细 → 连接业务对象 → 计算指标 → 筛选或排名 → 按阅读顺序输出。CTE 能帮助你把这些步骤写清楚。
WITH 明细层 AS ( SELECT ... FROM ... ), 指标层 AS ( SELECT ... FROM 明细层 GROUP BY ... ) SELECT ... FROM 指标层 ORDER BY ...;
先把业务问题翻译成数据问题
“哪些客户更值得关注?”可能需要客户行业、商机数量、成交数量和成交金额;“哪个产品表现更好?”需要产品维度、商机总数、成交数和成交率;“销售排名如何?”需要先汇总,再使用窗口函数排名。
不要一上来就堆 SQL。先写出你希望结果表有哪些列,再反推每列来自哪张表、需要什么计算。这样能减少 JOIN 错表、统计重复和指标口径不清。
COUNT(p.opportunity_id) AS opportunity_count
SUM(CASE WHEN p.deal_stage = 'Won'
THEN p.close_value ELSE 0 END) AS won_close_value
ROUND(100.0 * 已成交商机数 / 商机总数, 2) AS won_rate_pct小提醒:LEFT JOIN 可以把没有商机的客户也保留下来;如果只想看有商机的客户,才考虑使用 INNER JOIN 或在后续加筛选。
指标口径要能被别人复算
成交金额只统计 deal_stage = 'Won' 的记录;成交率的分母是该分析范围内的全部商机;客户最近行为按 engage_date 判断,而不是按 close_date。每个指标都要说明分子、分母和时间范围。
本课的标准答案不要求你写出完全一样的 SQL,但会检查最终字段、行数、数据和排序。只要你的写法等价,结果正确,就可以完成任务。
做完查询后,再问一句“这个结果能说明什么?”
高成交率不一定代表产品最好,可能只是样本量很小;成交金额高的客户也不一定适合马上投入资源,还要结合行业、规模和最近跟进情况。SQL 负责把事实整理出来,产品判断还需要结合业务背景。
练习
这是综合实战。每题只解锁当前任务,重点检查 JOIN 范围、指标口径、窗口排名和最终排序。