常规ROW_NUMBER会强行打散并列数据,业务榜单、绩效排名场景需要同分同排名,是大厂数据分析、后端高频面试题。
场景:按商品品类分组,统计各组销量榜单,要求销量相同则排名一致,分别实现跳号排名、连续排名两种规则。核心知识点:三类排名窗口函数差异、分组内并列排名、嵌套查询筛选TOP数据、函数选型踩坑点。
① 测试数据表与数据初始化
drop table if exists goods_sale;CREATE TABLE if not exists goods_sale (cate VARCHAR(20),goods_name VARCHAR(30),sale_num INT);INSERT INTO goods_sale VALUES('数码','手机A',520),('数码','手机B',520),('数码','耳机C',480),('数码','充电宝D',480),('数码','音箱E',410),('家居','桌椅F',630),('家居','收纳柜G',590),('家居','灯具H',590);
select * from goods_sale;

② 核心SQL 完整实现
-- 方式1:RANK() 并列同排名,后续名次跳号(通用榜单场景)
WITH rank_data AS (
SELECT
cate,
goods_name,
sale_num,
RANK() OVER(PARTITION BY cate ORDER BY sale_num DESC) AS rk
FROM goods_sale
)
SELECT * FROM rank_data WHERE rk <= 3;

-- 方式2:DENSE_RANK() 并列同排名,后续名次连续(评级/分层场景)
WITH dense_rank_data AS (
SELECT
cate,
goods_name,
sale_num,
DENSE_RANK() OVER(PARTITION BY cate ORDER BY sale_num DESC) AS drk
FROM goods_sale
)
SELECT * FROM dense_rank_data WHERE drk <= 3;

解题&选型总结(面试+实战要点)
ROW_NUMBER:无并列,序号连续,纯取前N条数据使用; RANK:同分同名次,排名跳号,销售榜单、排行榜首选; DENSE_RANK:同分同名次,排名连续,等级划分、档位分层首选; 优化建议:分组+排序字段建议建立复合索引,千万级数据下避免文件排序。
文章来源:
四季读书网
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至23467321@qq.com举报,一经查实,本站将立刻删除;如已特别标注为本站原创文章的,转载时请以链接形式注明文章出处,谢谢!