SHEIN大数据面试SQL-上新商品的首周销量统计
⚠️ 待修正
一、题目背景
这道题来自SHEIN的数据分析岗面试。SHEIN是快时尚跨境电商,数据分析师需要从海量业务数据中挖掘洞见。
业务场景:用户消费行为相关需求在日常工作中频繁出现,这类型的SQL题是面试高频考点。
一、题目
SHEIN每天都有大量新品上架,需要统计每个上新商品在上架后首周(7天内)的累计销量,评估新品的市场表现。
假设有两张表:
product_launch:商品上架时间表order_detail:订单明细表
-- product_launch 商品上架表
+---------+-------------------+
| sku_id | launch_time |
+---------+-------------------+
| SKU001 | 2025-06-01 08:00 |
| SKU002 | 2025-06-03 10:00 |
| SKU003 | 2025-06-05 09:00 |
+---------+-------------------+
-- order_detail 订单明细表
+----------+---------+--------+-------------------+
| order_id | sku_id | qty | order_time |
+----------+---------+--------+-------------------+
| 1001 | SKU001 | 2 | 2025-06-02 10:00 |
| 1002 | SKU001 | 1 | 2025-06-05 14:00 |
| 1003 | SKU001 | 3 | 2025-06-09 09:00 |
| 1004 | SKU002 | 2 | 2025-06-04 10:00 |
| 1005 | SKU002 | 1 | 2025-06-08 16:00 |
| 1006 | SKU002 | 5 | 2025-06-12 11:00 |
| 1007 | SKU003 | 1 | 2025-06-06 08:00 |
| 1008 | SKU003 | 1 | 2025-06-14 12:00 |
+----------+---------+--------+-------------------+
三、思路分析
JOIN两表,筛选订单时间在上架后7天内的记录:datediff(order_time, launch_time) between 0 and 6;- 按SKU分组汇总首周销量;
- 注意保留那些首周0销量的新品(使用
LEFT JOIN)。
| 维度 | 评分 |
|---|---|
| 题目难度 | ⭐️⭐️⭐️ |
| 题目清晰度 | ⭐️⭐️⭐️⭐️⭐️ |
| 业务常见度 | ⭐️⭐️⭐️⭐️⭐️ |
四、逐步推导
1.筛选首周内的订单
执行SQL
select l.sku_id,
l.launch_time,
o.order_id,
o.qty,
o.order_time,
datediff(o.order_time, l.launch_time) as days_from_launch
from product_launch l
left join order_detail o
on l.sku_id = o.sku_id
and datediff(o.order_time, l.launch_time) between 0 and 6
查询结果
+---------+-------------------+----------+------+-------------------+------------------+
| sku_id | launch_time | order_id | qty | order_time | days_from_launch |
+---------+-------------------+----------+------+-------------------+------------------+
| SKU001 | 2025-06-01 08:00 | 1001 | 2 | 2025-06-02 10:00 | 1 |
| SKU001 | 2025-06-01 08:00 | 1002 | 1 | 2025-06-05 14:00 | 4 |
| SKU002 | 2025-06-03 10:00 | 1004 | 2 | 2025-06-04 10:00 | 1 |
| SKU002 | 2025-06-03 10:00 | 1005 | 1 | 2025-06-08 16:00 | 5 |
| SKU003 | 2025-06-05 09:00 | 1007 | 1 | 2025-06-06 08:00 | 0 |
+---------+-------------------+----------+------+-------------------+------------------+
2.汇总每个SKU的首周销量
执行SQL
select l.sku_id,
l.launch_time,
coalesce(sum(o.qty), 0) as first_week_sales
from product_launch l
left join order_detail o
on l.sku_id = o.sku_id
and datediff(o.order_time, l.launch_time) between 0 and 6
group by l.sku_id, l.launch_time
查询结果
+---------+-------------------+------------------+
| sku_id | launch_time | first_week_sales |
+---------+-------------------+------------------+
| SKU001 | 2025-06-01 08:00 | 3 |
| SKU002 | 2025-06-03 10:00 | 3 |
| SKU003 | 2025-06-05 09:00 | 1 |
+---------+-------------------+------------------+
五、常见坑点
坑1:CASE WHEN条件的顺序 — 从上到下匹配,先命中先生效。写区间时从低到高或从高到低,避免条件重叠。
坑2:占比计算的分母 — SUM() OVER() 不带 PARTITION BY 才是全局总量,加了PARTITION BY分母变成组内总量。
六、举一反三
-
动态分段:阈值存在配置表中用JOIN取值,灵活调整分段策略
-
累计分布CDF:
SUM(cnt) OVER (ORDER BY bucket)算累计占比,画帕累托图 -
按时间维度对比:按天/周/月分区,观察分布的时序变化
七、知识点总结
| 考点 | 说明 |
|---|---|
| 多表JOIN | LEFT JOIN保留主表所有数据,COALESCE处理NULL |
| GROUP BY + 聚合函数 | 分组聚合是数据分析的基础,配合HAVING筛选分组结果 |
| 日期函数 | DATEDIFF / DATE_ADD / unix_timestamp处理日期运算 |
| NULL值处理 | NULL在聚合和窗口函数中的差异,COALESCE/NVL的替代方案 |
八、建表语句和数据插入
点击展开 DDL & DML
--建表语句
CREATE TABLE product_launch (
sku_id string COMMENT 'SKU编码',
launch_time string COMMENT '上架时间'
) COMMENT '商品上架时间表';
CREATE TABLE order_detail (
order_id bigint COMMENT '订单ID',
sku_id string COMMENT 'SKU编码',
qty int COMMENT '购买数量',
order_time string COMMENT '下单时间'
) COMMENT '订单明细表';
-- 插入数据
insert into product_launch(sku_id, launch_time) values
('SKU001', '2025-06-01 08:00'),
('SKU002', '2025-06-03 10:00'),
('SKU003', '2025-06-05 09:00');
insert into order_detail(order_id, sku_id, qty, order_time) values
(1001, 'SKU001', 2, '2025-06-02 10:00'),
(1002, 'SKU001', 1, '2025-06-05 14:00'),
(1003, 'SKU001', 3, '2025-06-09 09:00'),
(1004, 'SKU002', 2, '2025-06-04 10:00'),
(1005, 'SKU002', 1, '2025-06-08 16:00'),
(1006, 'SKU002', 5, '2025-06-12 11:00'),
(1007, 'SKU003', 1, '2025-06-06 08:00'),
(1008, 'SKU003', 1, '2025-06-14 12:00');
📱关注公众号
「数据仓库技术」文章同步更新,不错过每一篇干货

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