当前位置: 首页 > news >正文

MySQL8 排名窗口函数实战

在数据库查询与数据分析中,对数据分组并进行排名是一项常见任务。SQL 窗口函数为此提供了高效的解决方案。本文旨在阐明三个核心排名函数——RANK()DENSE_RANK()ROW_NUMBER()——的功能、差异及适用场景。

示例数据模型

以下说明将基于一张students表示例,该表记录了学生的班级与分数。其中,'A’班存在分数相同的学生,这有助于展示各函数的关键区别。

-- 表结构与数据
create table students
(id    int auto_increment primary key,name  varchar(50) not null,class varchar(10) null,score int         null
);INSERT INTO students (name, class, score) VALUES
('甲', 'A', 85),
('乙', 'A', 90),
('丙', 'B', 95),
('丁', 'B', 80),
('张三', 'A', 90);

1. RANK(): 标准排名 (非连续)

RANK() 函数提供标准的排名功能。当存在数值相等的行时,这些行将获得相同的排名,但后续名次的序号将会跳跃。

查询语句:

select name, class, score, rank() over (partition by class order by score desc) as class_rank
from students;

结果:

nameclassscoreclass_rank
A901
张三A901
A853
B951
B802

分析: 在 ‘A’ 班中,‘乙’ 和 ‘张三’ 因分数相同而并列第 1。随后的 ‘甲’ 的排名为第 3,序列跳过了第 2 名。

2. DENSE_RANK(): 紧凑排名 (连续)

DENSE_RANK() 函数在处理并列排名时,不会在名次序列中产生间隙,确保排名是连续的。

查询语句:

select name, class, score, dense_rank() over (partition by class order by score desc) as class_rank
from students;

结果:

nameclassscoreclass_rank
A901
张三A901
A852
B951
B802

分析: 在 ‘A’ 班中,‘乙’ 和 ‘张三’ 并列第 1 后,‘甲’ 的排名为第 2,名次序列保持了连续性。

3. ROW_NUMBER(): 行号分配 (唯一)

ROW_NUMBER() 函数不考虑数值的并列情况,它为分区内的每一行分配一个从 1 开始的、唯一的、连续的整数。

查询语句:

select name, class, score, row_number() over (partition by class order by score desc) as class_rank
from students;

结果:

nameclassscoreclass_rank
A901
张三A902
A853
B951
B802

分析: 即使 ‘乙’ 和 ‘张三’ 的分数相同,ROW_NUMBER() 依然为它们分配了 1 和 2 两个不同的序号。

功能对比与应用场景

函数并列处理排名是否连续主要应用场景
RANK()排名相同不连续 (跳跃)体育赛事等传统排名
DENSE_RANK()排名相同连续 (无间隙)榜单排名,要求名次紧凑
ROW_NUMBER()无并列排名连续分组获取 Top N 记录,数据去重

在实际应用中,应根据排名是否需要处理并列以及名次序列是否需要连续来选择合适的函数。

http://www.dtcms.com/a/352298.html

相关文章:

  • 面试:Spring
  • 30.LSTM-长短时记忆单元
  • 抢红包案例加强版
  • 并行多核体系结构基础——共享存储并行编程(笔记)
  • 网络编程close学习
  • Java大厂面试实录:从Spring Boot到Kubernetes的全链路技术突围
  • python命名规则(PEP 8 速查表),以及自定义属性
  • 深度感知卷积和深度感知平均池化
  • python自动测试 crictl 可以从哪些国内镜像源成功拉取镜像
  • pulsar、rocketmq常用命令
  • C#由Dictionary不正确释放造成的内存泄漏问题与GC代系
  • Text to Speech技术详解与实战:GPT-4o Mini TTS API应用指南
  • 从“脚本语言”到“企业级引擎”——PHP 在 2025 年技术栈中的再定位
  • Linux服务器安全配置与NTP时间同步
  • 记录一下,qt问题:qt ui文件的改动无法更新到cpp
  • 疯狂星期四文案网第51天运营日记
  • Typescript入门-interface讲解
  • 类型签名,位置参数,关键字参数
  • open webui源码分析8—管道
  • 域名常见问题集(十一)——为什么要进行域名管理?
  • 【实时Linux实战系列】基于实时Linux的音频实时监控系统
  • 从16个粉丝到680万年收入:AI创业的117天奇迹
  • 声明式微服务通信新范式:OpenFeign如何简化RestTemplate调用
  • Windows下实现类似`watch nvidia-smi`的实时监控效果
  • 进入docker中mysql容器的方法
  • Java:TreeSet的使用
  • (Arxiv-2024)VideoMaker:零样本定制化视频生成,依托于视频扩散模型的内在力量
  • QT qml(quick3D)模型的移动
  • 专业解读《Light》封面:可调谐混合超表面(THCMs)如何革新下一代LiDAR系统
  • 3D游戏角色建模资源搜索指南(资料来源于网络)