跳到主要内容

美团大数据面试SQL-商家评分Top N及变化趋势

⚠️ 待修正

一、题目背景

这道题来自美团到店事业群的数据分析岗面试。美团拥有数百万商家,商家评分是用户选择餐厅的核心参考,也是平台对商家分级管理的依据。评分Top N排名和环比变化趋势,能帮助运营快速识别"上升期优质商家"和"下滑中的问题商家"。

业务场景:商家运营团队每周出"评分Top 10黑马榜"——评分上升最快的新商家,给予流量扶持。同时监控Top商家的评分是否持续下滑(可能是服务质量下降的信号),及时触发商家质量预警。

二、题目

现有一张商家月度评分表 t3_shop_monthly_rating,记录了每个商家每月的综合评分。请查询当前月(2023-03)评分排名Top 3的商家,并统计其评分相较上月的变化。

商家月度评分表 t3_shop_monthly_rating:

+----------+---------+--------+
| shop_id | month | rating |
+----------+---------+--------+
| S001 | 2023-02 | 4.5 |
| S001 | 2023-03 | 4.7 |
| S002 | 2023-02 | 4.8 |
| S002 | 2023-03 | 4.6 |
| S003 | 2023-02 | 4.2 |
| S003 | 2023-03 | 4.4 |
| S004 | 2023-02 | 4.9 |
| S004 | 2023-03 | 4.9 |
| S005 | 2023-02 | 4.0 |
| S005 | 2023-03 | 4.1 |
| S006 | 2023-02 | 4.3 |
| S006 | 2023-03 | 4.5 |
+----------+---------+--------+

三、思路分析

本题考察排名(RANK)和环比变化(LAG)的组合应用。

解题步骤

  1. 获取当前月(2023-03)和上月的评分数据;
  2. 对当前月数据按评分降序排名,取Top 3;
  3. 关联上月数据计算评分变化;
维度评分
题目难度⭐️⭐️⭐️
题目清晰度⭐️⭐️⭐️⭐️⭐️
业务常见度⭐️⭐️⭐️⭐️⭐️

四、逐步推导

1. 提取当前月和上月评分

执行SQL

select shop_id,
max(case when month = '2023-03' then rating end) as cur_rating,
max(case when month = '2023-02' then rating end) as prev_rating
from t3_shop_monthly_rating
where month in ('2023-02', '2023-03')
group by shop_id

执行结果

+----------+------------+-------------+
| shop_id | cur_rating | prev_rating |
+----------+------------+-------------+
| S001 | 4.7 | 4.5 |
| S002 | 4.6 | 4.8 |
| S003 | 4.4 | 4.2 |
| S004 | 4.9 | 4.9 |
| S005 | 4.1 | 4.0 |
| S006 | 4.5 | 4.3 |
+----------+------------+-------------+

2. 排名并取Top 3,计算环比变化

执行SQL

select shop_id,
cur_rating,
prev_rating,
round(cur_rating - prev_rating, 2) as rating_change,
rn as rank_num
from (
select shop_id,
cur_rating,
prev_rating,
cur_rating - prev_rating as rating_change_val,
rank() over (order by cur_rating desc) as rn
from (
select shop_id,
max(case when month = '2023-03' then rating end) as cur_rating,
max(case when month = '2023-02' then rating end) as prev_rating
from t3_shop_monthly_rating
where month in ('2023-02', '2023-03')
group by shop_id
) t1
) t2
where rn <= 3
order by rn

执行结果

+----------+------------+-------------+---------------+----------+
| shop_id | cur_rating | prev_rating | rating_change | rank_num |
+----------+------------+-------------+---------------+----------+
| S004 | 4.9 | 4.9 | 0.0 | 1 |
| S001 | 4.7 | 4.5 | 0.2 | 2 |
| S002 | 4.6 | 4.8 | -0.2 | 3 |
+----------+------------+-------------+---------------+----------+

S004以4.9分稳居榜首,评分持平;S001评分上升0.2进入前三;S002虽排名第三但评分下降了0.2。

五、常见坑点

坑1:上月数据缺失时的处理

如果某商家上个月没有评分记录,LAG 返回 NULL,评分变化 = NULL。应该用 COALESCE 或 LEFT JOIN 上月表来区分"新上榜商家"和"评分未变化商家"。

坑2:RANK vs ROW_NUMBER 的选择

评分相同时,RANK 产生并列排名(1,1,3),ROW_NUMBER 硬排序(1,2,3)。"Top 3"如果用 ROW_NUMBER,两个并列第1的商家会挤掉第3名。通常评分排名用 RANK 更合理——并列评分应该并列名次。

坑3:只取当月Top 3但上月可能不在Top 3

在上月数据中 JOIN 时限定 WHERE month=上月,不受当前月排名影响。但上月不在Top 3的商家,评分变化仍可计算,只要上月有记录即可。

六、举一反三

  1. 分层Top N:加上 category_id 分组,实现"各品类评分Top N"
  2. 评分趋势预警:连续2个月评分下降 ≥ 0.3 的商家,标记为"质量下滑预警"推送商家运营
  3. 加权评分:综合评分 × 0.6 + 评论数归一化分数 × 0.4,让"高评分+高评论量"的商家更容易被发现
  4. 按城市/商圈维度:GROUP BY 加上 city_id,对比不同商圈的优质商家密度

七、知识点总结

考点说明
RANK() OVER按评分降序排名,处理并列值
LAG() 环比获取每个商家上月评分,计算评分变化
WHERE 当月 + LEFT JOIN 上月保留当月Top 3,关联上月数据做对比
CONCAT + ROUND格式化评分变化为易读字符串

八、建表语句和数据插入

点击展开 DDL & DML
CREATE TABLE t3_shop_monthly_rating (
shop_id string COMMENT '商家ID',
month string COMMENT '月份',
rating decimal(2,1) COMMENT '综合评分'
) COMMENT '商家月度评分表';

-- 数据插入
INSERT INTO t3_shop_monthly_rating VALUES
('S001', '2023-02', 4.5),
('S001', '2023-03', 4.7),
('S002', '2023-02', 4.8),
('S002', '2023-03', 4.6),
('S003', '2023-02', 4.2),
('S003', '2023-03', 4.4),
('S004', '2023-02', 4.9),
('S004', '2023-03', 4.9),
('S005', '2023-02', 4.0),
('S005', '2023-03', 4.1),
('S006', '2023-02', 4.3),
('S006', '2023-03', 4.5);
📱关注公众号

「数据仓库技术」文章同步更新,不错过每一篇干货

微信公众号二维码
💬加群交流

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

交流微信二维码

你可能还想看