SHEIN大数据面试SQL-不同国家/地区GMV排名
⚠️ 待修正
一、题目背景
这道题来自SHEIN的数据分析岗面试。SHEIN是快时尚跨境电商,数据分析师需要从海量业务数据中挖掘洞见。
业务场景:用户消费行为相关需求在日常工作中频繁出现,这类型的SQL题是面试高频考点。
一、题目
SHEIN作为跨境电商平台,需要按国家/地区统计GMV(销售额),并给出排名。计算2025年6月每个国家的总GMV及排名,GMV=商品单价×销售数量。
假设有订单表 shein_orders:
+----------+----------+---------+--------+------------+-------------------+
| order_id | country | sku_id | price | sale_qty | order_time |
+----------+----------+---------+--------+------------+-------------------+
| 1001 | US | SKU001 | 15.00 | 2 | 2025-06-01 10:00 |
| 1002 | UK | SKU002 | 25.00 | 1 | 2025-06-02 11:00 |
| 1003 | US | SKU003 | 10.00 | 3 | 2025-06-03 09:00 |
| 1004 | JP | SKU001 | 15.00 | 1 | 2025-06-04 12:00 |
| 1005 | US | SKU002 | 25.00 | 2 | 2025-06-05 14:00 |
| 1006 | UK | SKU003 | 10.00 | 5 | 2025-06-06 10:00 |
| 1007 | FR | SKU001 | 15.00 | 1 | 2025-06-07 08:00 |
+----------+----------+---------+--------+------------+-------------------+
三、思路分析
- 按国家分组,计算每个国家的GMV = sum(price * sale_qty);
- 使用
RANK()/DENSE_RANK()按GMV降序排名; - 题目简单,核心考察聚合函数和排名窗口函数的使用。
| 维度 | 评分 |
|---|---|
| 题目难度 | ⭐️⭐️ |
| 题目清晰度 | ⭐️⭐️⭐️⭐️⭐️ |
| 业务常见度 | ⭐️⭐️⭐️⭐️⭐️ |
四、逐步推导
1.按国家统计GMV
执行SQL
select country,
round(sum(price * sale_qty), 2) as gmv
from shein_orders
where substr(order_time, 1, 7) = '2025-06'
group by country
查询结果
+---------+--------+
| country | gmv |
+---------+--------+
| US | 110.00 |
| UK | 75.00 |
| JP | 15.00 |
| FR | 15.00 |
+---------+--------+
2.按GMV降序排名
执行SQL
select country,
gmv,
rank() over (order by gmv desc) as rk
from (
select country,
round(sum(price * sale_qty), 2) as gmv
from shein_orders
where substr(order_time, 1, 7) = '2025-06'
group by country
) t
order by rk
查询结果
+---------+--------+-----+
| country | gmv | rk |
+---------+--------+-----+
| US | 110.00 | 1 |
| UK | 75.00 | 2 |
| JP | 15.00 | 3 |
| FR | 15.00 | 3 |
+---------+--------+-----+
五、常见坑点
坑1:RANK vs DENSE_RANK vs ROW_NUMBER — 并列值处理不同:ROW_NUMBER硬区分,RANK跳跃,DENSE_RANK连续。统计"前N名"需明确业务倾向。
坑2:NULL值排序位置 — ORDER BY 默认 NULLS LAST,如果排序列有 NULL,Top N可能被挤掉。
六、举一反三
-
分组Top N:
PARTITION BY category实现每个品类/区域的前N名 -
含占比的排名:
SUM() OVER()算总量,每个条目除总量得贡献度 -
滚动时间窗口Top N:限定过去30天数据,更适合分析趋势变化
七、知识点总结
| 考点 | 说明 |
|---|---|
| RANK / DENSE_RANK / ROW_NUMBER | 排名函数三剑客,并列处理方式不同 |
| GROUP BY + 聚合函数 | 分组聚合是数据分析的基础,配合HAVING筛选分组结果 |
八、建表语句和数据插入
点击展开 DDL & DML
--建表语句
CREATE TABLE shein_orders (
order_id bigint COMMENT '订单ID',
country string COMMENT '国家/地区',
sku_id string COMMENT 'SKU编码',
price decimal(10,2) COMMENT '商品单价',
sale_qty int COMMENT '销售数量',
order_time string COMMENT '下单时间'
) COMMENT 'SHEIN订单表';
-- 插入数据
insert into shein_orders(order_id, country, sku_id, price, sale_qty, order_time) values
(1001, 'US', 'SKU001', 15.00, 2, '2025-06-01 10:00'),
(1002, 'UK', 'SKU002', 25.00, 1, '2025-06-02 11:00'),
(1003, 'US', 'SKU003', 10.00, 3, '2025-06-03 09:00'),
(1004, 'JP', 'SKU001', 15.00, 1, '2025-06-04 12:00'),
(1005, 'US', 'SKU002', 25.00, 2, '2025-06-05 14:00'),
(1006, 'UK', 'SKU003', 10.00, 5, '2025-06-06 10:00'),
(1007, 'FR', 'SKU001', 15.00, 1, '2025-06-07 08:00');
📱关注公众号
「数据仓库技术」文章同步更新,不错过每一篇干货

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