SQL(面试真题+实战):TOP-K 问题拓展 - 分组内取前N条且允许并列排名

四季读书网 2 0
SQL(面试真题+实战):TOP-K 问题拓展 - 分组内取前N条且允许并列排名

常规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(面试真题+实战):TOP-K 问题拓展 - 分组内取前N条且允许并列排名-第1张图片-四季读书网

② 核心SQL 完整实现

-- 方式1RANK() 并列同排名,后续名次跳号(通用榜单场景)
WITH rank_data AS (
SELECT
cate,
goods_name,
sale_num,
RANK() OVER(PARTITION BY cate ORDER BY sale_num DESCAS rk
FROM goods_sale
)
SELECT FROM rank_data WHERE rk <= 3;
SQL(面试真题+实战):TOP-K 问题拓展 - 分组内取前N条且允许并列排名-第2张图片-四季读书网
-- 方式2DENSE_RANK() 并列同排名,后续名次连续(评级/分层场景)
WITH dense_rank_data AS (
SELECT
cate,
goods_name,
sale_num,
DENSE_RANK() OVER(PARTITION BY cate ORDER BY sale_num DESCAS drk
FROM goods_sale
)
SELECT FROM dense_rank_data WHERE drk <= 3;
SQL(面试真题+实战):TOP-K 问题拓展 - 分组内取前N条且允许并列排名-第3张图片-四季读书网

解题&选型总结(面试+实战要点)

  1. ROW_NUMBER
    :无并列,序号连续,纯取前N条数据使用;
  2. RANK
    :同分同名次,排名跳号,销售榜单、排行榜首选;
  3. DENSE_RANK
    :同分同名次,排名连续,等级划分、档位分层首选;
  4. 优化建议:分组+排序字段建议建立复合索引,千万级数据下避免文件排序。

抱歉,评论功能暂时关闭!