SHEIN大数据面试SQL-爆款商品的销量增长趋势
⚠️ 待修正
一、题目背景
这道题来自SHEIN的数据分析岗面试。SHEIN是快时尚跨境电商,数据分析师需要从海量业务数据中挖掘洞见。
业务场景:用户消费行为相关需求在日常工作中频繁出现,这类型的SQL题是面试高频考点。
一、题目
SHEIN需要监控爆款商品每周的销量增长趋势。给定所有商品的周销量数据,计算每个SKU每周销量较上周的环比增长率,并筛选出连续3周销量增长的"潜力爆款"商品。
假设有周销量表 weekly_sales:
+---------+--------+------------+
| sku_id | week | sale_qty |
+---------+--------+------------+
| SKU001 | 202523 | 100 |
| SKU001 | 202524 | 120 |
| SKU001 | 202525 | 150 |
| SKU001 | 202526 | 180 |
| SKU002 | 202523 | 80 |
| SKU002 | 202524 | 70 |
| SKU002 | 202525 | 90 |
| SKU002 | 202526 | 95 |
| SKU003 | 202523 | 200 |
| SKU003 | 202524 | 210 |
| SKU003 | 202525 | 215 |
| SKU003 | 202526 | 220 |
+---------+--------+------------+
三、思路分析
- 使用
LAG窗口函数获取每个SKU上一周的销量; - 计算环比增长率 = (本周销量 - 上周销量) / 上周销量;
- 筛选连续增长的条件:当前周环比 > 0 且上一周环比 > 0 且上上周环比 > 0(即连续3周环比为正)。
| 维度 | 评分 |
|---|---|
| 题目难度 | ⭐️⭐️⭐️ |
| 题目清晰度 | ⭐️⭐️⭐️⭐️ |
| 业务常见度 | ⭐️⭐️⭐️⭐️⭐️ |
四、逐步推导
1.使用LAG计算环比增长率
执行SQL
select sku_id,
week,
sale_qty,
lag(sale_qty, 1) over (partition by sku_id order by week) as prev_qty,
round((sale_qty - lag(sale_qty, 1) over (partition by sku_id order by week))
/ lag(sale_qty, 1) over (partition by sku_id order by week), 4) as growth_rate
from weekly_sales
查询结果
+---------+--------+----------+----------+--------------+
| sku_id | week | sale_qty | prev_qty | growth_rate |
+---------+--------+----------+----------+--------------+
| SKU001 | 202523 | 100 | NULL | NULL |
| SKU001 | 202524 | 120 | 100 | 0.2000 |
| SKU001 | 202525 | 150 | 120 | 0.2500 |
| SKU001 | 202526 | 180 | 150 | 0.2000 |
| SKU002 | 202523 | 80 | NULL | NULL |
| SKU002 | 202524 | 70 | 80 | -0.1250 |
| SKU002 | 202525 | 90 | 70 | 0.2857 |
| SKU002 | 202526 | 95 | 90 | 0.0556 |
| SKU003 | 202523 | 200 | NULL | NULL |
| SKU003 | 202524 | 210 | 200 | 0.0500 |
| SKU003 | 202525 | 215 | 210 | 0.0238 |
| SKU003 | 202526 | 220 | 215 | 0.0233 |
+---------+--------+----------+----------+--------------+
2.筛选连续3周增长的SKU
执行SQL
select sku_id,
max(consecutive_growth_weeks) as max_consecutive_weeks
from (
select sku_id,
week,
growth_rate,
sum(case when growth_rate > 0 then 1 else 0 end)
over (partition by sku_id order by week
rows between 2 preceding and current row) as consecutive_growth_weeks
from (
select sku_id,
week,
sale_qty,
round((sale_qty - lag(sale_qty, 1) over (partition by sku_id order by week))
/ lag(sale_qty, 1) over (partition by sku_id order by week), 4) as growth_rate
from weekly_sales
) t
) tt
group by sku_id
having max(consecutive_growth_weeks) = 3
查询结果
+---------+-----------------------+
| sku_id | max_consecutive_weeks |
+---------+-----------------------+
| SKU001 | 3 |
| SKU003 | 3 |
+---------+-----------------------+
五、常见坑点
坑1:NULL值的隐式处理 — 聚合函数跳过NULL,窗口函数不跳过。WHERE需显式过滤或用COALESCE替代。
坑2:数据类型不一致导致JOIN失效 — string vs int隐式转换可能触发全表扫描,性能骤降。
六、举一反三
-
增加时间维度对比:按天/周/月分组,观察指标的趋势和季节性波动
-
增加分组维度:按品类/地区/渠道拆解,发现差异化的业务洞察
-
设置预警阈值:在WHERE中加阈值判断,自动筛选异常数据
七、知识点总结
| 考点 | 说明 |
|---|---|
| LAG / LEAD | 获取前/后一行数据,用于环比计算、状态变更检测 |
| CASE WHEN 条件聚合 | 灵活实现分段统计、条件计数、标签化处理 |
| GROUP BY + 聚合函数 | 分组聚合是数据分析的基础,配合HAVING筛选分组结果 |
| NULL值处理 | NULL在聚合和窗口函数中的差异,COALESCE/NVL的替代方案 |
八、建表语句和数据插入
点击展开 DDL & DML
--建表语句
CREATE TABLE weekly_sales (
sku_id string COMMENT 'SKU编码',
week string COMMENT '周标识(格式YYYYWW)',
sale_qty int COMMENT '周销量'
) COMMENT 'SKU周销量表';
-- 插入数据
insert into weekly_sales(sku_id, week, sale_qty) values
('SKU001', '202523', 100),
('SKU001', '202524', 120),
('SKU001', '202525', 150),
('SKU001', '202526', 180),
('SKU002', '202523', 80),
('SKU002', '202524', 70),
('SKU002', '202525', 90),
('SKU002', '202526', 95),
('SKU003', '202523', 200),
('SKU003', '202524', 210),
('SKU003', '202525', 215),
('SKU003', '202526', 220);
📱关注公众号
「数据仓库技术」文章同步更新,不错过每一篇干货

💬加群交流
备注「数据仓库技术」加入社群,每日一道大厂SQL真题
