美团大数据面试SQL-用户评价情感分类统计
⚠️ 待修正
一、题目背景
这道题来自美团的数据分析岗面试。美团是本地生活服务(外卖、到店、酒旅),数据分析师需要从海量业务数据中挖掘洞见。
业务场景:数据分析相关需求在日常工作中频繁出现,这类型的SQL题是面试高频考点。
一、题目
现有一张用户评价表 t5_user_review,记录了每条订单的用户评分(1-5星)。请按以下规则统计各类评价的数量和占比:
| 评分范围 | 分类 |
|---|---|
| 4-5星 | 好评 |
| 3星 | 中评 |
| 1-2星 | 差评 |
用户评价表 t5_user_review:
+----------+----------+--------+
| order_id | user_id | rating |
+----------+----------+--------+
| D001 | u01 | 5 |
| D002 | u02 | 4 |
| D003 | u03 | 3 |
| D004 | u01 | 2 |
| D005 | u04 | 5 |
| D006 | u02 | 1 |
| D007 | u05 | 4 |
| D008 | u03 | 5 |
| D009 | u04 | 3 |
| D010 | u01 | 4 |
+----------+----------+--------+
三、思路分析
本题是评价分类的基础统计题,考察 CASE WHEN + GROUP BY 的组合使用。
解题步骤:
- 使用 CASE WHEN 将评分映射到评价类别;
- 按类别分组统计数量和占比;
| 维度 | 评分 |
|---|---|
| 题目难度 | ⭐️ |
| 题目清晰度 | ⭐️⭐️⭐️⭐️⭐️ |
| 业务常见度 | ⭐️⭐️⭐️⭐️⭐️ |
四、逐步推导
统计各类评价的数量及占比
执行SQL
select review_type,
count(1) as review_cnt,
round(count(1) / sum(count(1)) over (), 4) as review_rate
from (
select order_id,
user_id,
rating,
case
when rating >= 4 then '好评'
when rating = 3 then '中评'
else '差评'
end as review_type
from t5_user_review
) t
group by review_type
order by field(review_type, '好评', '中评', '差评')
执行结果
+-------------+------------+-------------+
| review_type | review_cnt | review_rate |
+-------------+------------+-------------+
| 好评 | 6 | 0.6000 |
| 中评 | 2 | 0.2000 |
| 差评 | 2 | 0.2000 |
+-------------+------------+-------------+
好评率60%,差评率20%。差评的2条订单(D004和D006)需要重点关注。
五、常见坑点
坑1:CASE WHEN条件的顺序 — 从上到下匹配,先命中先生效。写区间时从低到高或从高到低,避免条件重叠。
坑2:占比计算的分母 — SUM() OVER() 不带 PARTITION BY 才是全局总量,加了PARTITION BY分母变成组内总量。
六、举一反三
-
动态分段:阈值存在配置表中用JOIN取值,灵活调整分段策略
-
累计分布CDF:
SUM(cnt) OVER (ORDER BY bucket)算累计占比,画帕累托图 -
按时间维度对比:按天/周/月分区,观察分布的时序变化
七、知识点总结
| 考点 | 说明 |
|---|---|
| CASE WHEN 条件聚合 | 灵活实现分段统计、条件计数、标签化处理 |
| GROUP BY + 聚合函数 | 分组聚合是数据分析的基础,配合HAVING筛选分组结果 |
八、建表语句和数据插入
点击展开 DDL & DML
-- 建表语句
CREATE TABLE t5_user_review (
order_id string COMMENT '订单ID',
user_id string COMMENT '用户ID',
rating int COMMENT '评分(1-5)'
) COMMENT '用户评价表';
-- 数据插入
INSERT INTO t5_user_review VALUES
('D001', 'u01', 5),
('D002', 'u02', 4),
('D003', 'u03', 3),
('D004', 'u01', 2),
('D005', 'u04', 5),
('D006', 'u02', 1),
('D007', 'u05', 4),
('D008', 'u03', 5),
('D009', 'u04', 3),
('D010', 'u01', 4);
📱关注公众号
「数据仓库技术」文章同步更新,不错过每一篇干货

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