北美MKT求职必备[SQL](/blog/sql-mastery-guide)全攻略,两个月磨一剑
北美MKT求职必备[SQL](/blog/sql-mastery-guide)全攻略,两个月磨一剑 (English Translation Coming Soon)
我发现现在越来越多的MKT岗位,尤其是Product Marketing, Growth Marketing, Marketing Analyst,都把SQL作为硬性要求。我翻遍了各类面经,分析了超过50个真实的MKT SQL面试题,总结出了近20种常用的查询模式,并把它们归纳到10个核心的Business Case里。
MKT SQL知识体系
不同于SDE岗位,MKT SQL面试的核心不在于算法多牛,而在于你是否能将业务问题精准地翻译成数据查询逻辑。你的代码需要体现出对Marketing业务的深刻理解。
1. 数据提取与清洗 (LINK_placeholder_5 Extraction & Cleaning)
这是基本功。你需要熟练运用SELECT, WHERE, GROUP BY等从用户行为数据、广告投放数据、CRM数据中提取所需信息。清洗是关键,比如处理重复的用户记录、填补缺失的渠道来源、统一不同平台的时间格式等。
2. 核心分析方法 (Core Analytical Methods)
- Cohort Analysis (同期群分析): 这是分析用户行为模式的利器。你需要能用SQL划分不同时间注册的用户群组,并追踪他们后续的留存、付费等行为。
- Funnel Analysis (漏斗分析): 从用户认知、感兴趣、购买到忠诚的整个转化路径,每一步的流失率是多少?瓶颈在哪里?这需要你用SQL精准地定义漏斗的每一步,并计算转化率。
- Attribution Analysis (归因分析): 一个用户的最终转化,功劳应该算在哪个渠道上?是第一次触达的渠道(First-touch),还是最后一次点击的渠道(Last-touch)?你需要能用SQL实现不同的归因模型。
3. 关键业务指标 (Key Business Metrics)
- Customer Lifetime Value (CLV): 客户生命周期价值。你需要用SQL计算一个用户在整个生命周期内能为公司带来多少价值。
- Return on Investment (ROI): 投资回报率。特别是广告投放的ROI,即ROAS (Return on Ad Spend)。你需要关联广告花费和用户付费数据,计算每个Campaign的收益。
经典MKT SQL面试题详解
以下是我从大量面经中精选并改编的15道题,覆盖了从基础到进阶的各种场景。我们假设有以下几张表:
- users (user_id, created_at, country)
- events (event_id, user_id, event_name, event_time, platform)
- purchases (purchase_id, user_id, purchase_time, amount)
- ad_campaigns (campaign_id, campaign_name, start_date, end_date, cost)
- ad_clicks (click_id, user_id, campaign_id, click_time)
第一部分:基础查询与用户分析
Question 1: Find the total number of users registered in the last 30 days from the USA.
解析: 基础的筛选和计数。考察对日期函数和WHERE子句的运用。
SELECT COUNT(DISTINCT user_id)
FROM users
WHERE country = 'USA'
AND created_at >= CURRENT_DATE - INTERVAL '30 day';
Question 2: Calculate the Daily Active Users (DAU) for the past 7 days.
解析: DAU是衡量产品活跃度的核心指标。考察对日期处理和DISTINCT计数的掌握。
SELECT DATE(event_time) AS activity_date,
COUNT(DISTINCT user_id) AS dau
FROM events
WHERE event_time >= CURRENT_DATE - INTERVAL '7 day'
GROUP BY 1
ORDER BY 1;
Question 3: Find the top 5 countries with the highest number of registered users.
解析: 基础的聚合、排序和限制。这是最常见的描述性统计问题。
SELECT country,
COUNT(user_id) AS user_count
FROM users
GROUP BY 1
ORDER BY 2 DESC
LIMIT 5;
第二部分:漏斗分析与转化
Question 4: Calculate the conversion rate from viewing a product page to making a purchase.
解析: 漏斗分析的简化版。你需要先分别计算两个事件的用户数,然后相除。使用CTE (Common Table Expressions) 能让逻辑更清晰。
WITH product_viewers AS (
SELECT DISTINCT user_id
FROM events
WHERE event_name = 'view_product'
),
purchasers AS (
SELECT DISTINCT user_id
FROM purchases
)
SELECT CAST(COUNT(p.user_id) AS REAL) / COUNT(v.user_id)
FROM product_viewers v
LEFT JOIN purchasers p ON v.user_id = p.user_id;
Question 5: Build a user funnel for the following events: 'app_open', 'view_product', 'add_to_cart', 'purchase'.
解析: 完整的漏斗分析。关键在于如何一步步筛选出完成了前序步骤的用户。这里用LEFT JOIN或者带条件的聚合函数都可以实现。
SELECT
COUNT(DISTINCT user_id) AS total_users,
COUNT(DISTINCT [Case](/blog/case-study-9206) WHEN event_name = 'app_open' THEN user_id END) AS app_open_users,
COUNT(DISTINCT CASE WHEN event_name = 'view_product' THEN user_id END) AS view_product_users,
COUNT(DISTINCT CASE WHEN event_name = 'add_to_cart' THEN user_id END) AS add_to_cart_users,
COUNT(DISTINCT CASE WHEN event_name = 'purchase' THEN user_id END) AS purchase_users
FROM events;
第三部分:留存分析
Question 6: Calculate the Day-1, Day-3, and Day-7 retention rate for users who signed up in the first week of May 2025.
解析: 留存率是MKT分析的重中之重。这道题考察对日期计算、自连接 (self-join) 或窗口函数的运用。你需要清晰地定义同期群 (cohort) 和后续的活跃行为。
WITH cohort AS (
SELECT user_id,
created_at::date AS signup_date
FROM users
WHERE created_at >= '2025-05-01' AND created_at < '2025-05-08'
),
activity AS (
SELECT user_id,
event_time::date AS activity_date
FROM events
)
SELECT c.signup_date,
COUNT(DISTINCT c.user_id) AS cohort_size,
COUNT(DISTINCT CASE WHEN a.activity_date = c.signup_date + INTERVAL '1 day' THEN a.user_id END) AS day_1_retained,
CAST(COUNT(DISTINCT CASE WHEN a.activity_date = c.signup_date + INTERVAL '1 day' THEN a.user_id END) AS REAL) / COUNT(DISTINCT c.user_id) AS day_1_retention_rate
FROM cohort c
LEFT JOIN activity a ON c.user_id = a.user_id
GROUP BY 1
ORDER BY 1;
(Day-3, Day-7的计算逻辑类似,篇幅所限不赘述)
第四部分:ROI与广告活动分析
Question 7: Calculate the Return on Ad Spend (ROAS) for each campaign.
解析: 这是衡量广告效果最直接的指标。你需要连接广告点击、用户购买和广告花费三张表。核心是把用户的购买金额归因到他们点击的广告上。
SELECT c.campaign_name,
SUM(p.amount) AS total_revenue,
c.cost AS total_cost,
SUM(p.amount) / c.cost AS roas
FROM ad_campaigns c
JOIN ad_clicks cl ON c.campaign_id = cl.campaign_id
JOIN purchases p ON cl.user_id = p.user_id
WHERE p.purchase_time > cl.click_time -- 确保购买发生在点击之后
GROUP BY 1, 3
ORDER BY 4 DESC;
面试技巧与思维过程展示
在面试中,写出正确的代码只完成了60%。如何展示你的思维过程和业务理解能力,才是拉开差距的关键。
-
Clarify Business Requirements (澄清业务需求): 在动手写代码前,一定要和面试官确认你对问题的理解。比如问到“留存率”,你需要问清楚:“留存的定义是什么?是任意活跃事件算留存,还是必须是核心事件(如购买)?” “时间窗口如何计算?是严格的24小时,还是自然日?” 这体现了你的严谨性。
-
Showcase Your Thought Process (展示思维过程): 不要闷头写代码。一边写,一边向面试官解释你的思路。“我首先会用一个CTE来定义我们的目标用户群,也就是5月第一周注册的用户。然后,我会创建另一个CTE来记录所有用户的活跃日期。最后,我把这两个表join起来,通过计算日期差来判断用户是否在第1、3、7天回归。” 这种方式能让面试官清晰地跟上你的逻辑。
-
Handle Complex Joins (处理复杂连接): 当需要连接多张表时,清晰地解释你的join key是什么,以及为什么使用LEFT JOIN而不是INNER JOIN。比如在计算转化率时,用LEFT JOIN可以保留所有进入漏斗第一步的用户,即使他们没有完成后续步骤,这样才能正确计算分母。
-
Optimize Query Performance (优化查询性能): 在写完基础查询后,可以主动提出优化建议。“这个查询在大数据量下可能会比较慢,因为events表非常大。我们可以考虑先对events表按user_id和event_time建一个索引,或者创建一个只包含相关事件的物化视图 (materialized view) 来加速查询。” 这会让你看起来像一个有经验的Analyst,而不仅仅是一个SQL小子。
