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

mysql 查询排名,包括并列排名和连续排名

在MySQL中,根据不同的需求,查询排名可以分为并列排名和连续排名两种情况。

以下是分别实现这两种排名的方法,考虑到兼容性,这里会提供适合较早版本MySQL(即8.0之前版本)的解决方案,同时也提及MySQL 8.0及以上版本的新特性。

示例:查询学生成绩排名

        假设有一个scores表,包含学生的student_id和他们的score:

CREATE TABLE scores (student_id INT,score DECIMAL(4,2)
);INSERT INTO scores VALUES
(1, 95.00),
(2, 90.00),
(3, 95.00),
(4, 85.00),
(5, 78.00);

1、在MySQL(即8.0之前版本)中,由于不支持RANK()或DENSE_RANK()这类窗口函数,所以在早期版本中实现查询排名通常需要借助用户变量。

        1.1、并列排名

                对于并列排名,即分数相同的学生共享同一个排名,可以使用用户变量来实现。

                以下是一个示例:

SET @rank := 0;
SET @prev_score := NULL;SELECTstudent_id,score,@rank := IF(@prev_score = score, @rank, @rank + 1) AS rank,@prev_score := score
FROMscores
ORDER BYscore DESC;

                在这个例子中,当分数与前一个分数相同时,排名(@rank)保持不变,从而实现了并列排名。

        1.2、连续排名

                连续排名是指即使有并列,每个学生的排名都是唯一的,不跳过任何排名数字。

                这可以通过稍微修改上面的查询来实现:

SET @rank := 0;
SET @prev_score := NULL;
SET @rank_count := 1;SELECTstudent_id,score,@rank := @rank + (@prev_score = score) * @rank_count AS rank,@prev_score := score,@rank_count := IF(@prev_score = score, @rank_count + 1, 1) 
FROMscores
ORDER BYscore DESC;

        在这里,增加了一个新的变量@rank_count来跟踪连续排名中的并列次数,每当遇到相同的分数时,@rank_count递增,这样即使分数相同,每个学生的排名也是连续的。

2、MySQL 8.0及以上版本

        从MySQL 8.0开始,可以直接使用窗口函数来更简洁地实现这两种排名:

        2.1、并列排名:使用RANK()函数

  SELECTstudent_id,score,RANK() OVER (ORDER BY score DESC) AS rankFROMscores;

        2.2、连续排名:使用DENSE_RANK()函数

  SELECTstudent_id,score,DENSE_RANK() OVER (ORDER BY score DESC) AS rankFROMscores;

        RANK()会在遇到相同分数时产生跳过的排名,而DENSE_RANK()则不会跳过,直接给出连续的排名。

相关文章:

  • 阿里云PAI大模型评测最佳实践
  • 同三维T80002JEHV H.265高清解码器
  • SpringMvc-Restful
  • 纯前端实现导出excel
  • Steam邮件推送内容有哪些?配置教程详解!
  • QT实现人脸识别
  • 模版与策略模式
  • 百度文心智能体,创建属于自己的智能体应用
  • 安全管理中心-集中管控(6点)
  • C++ 结构体对齐详解
  • 一个易于使用、与Android系统良好整合的多合一游戏模拟器
  • 计算机网络 静态路由及动态路由RIP
  • JSON.parse 解析NaN, Infinity, -Infinity失败
  • 如何通过编程获取桌面分辨率、操作像素点颜色、保存位图和JPG格式图片,以及图片数据的处理和存储方式
  • 锂电池安全监测中会用到哪些气体传感器?
  • 时间复杂度分析经典问题——最大子序列和
  • 【划重点】MySQL技术内幕:InnoDB存储引擎
  • 4月23日世界读书日 网络营销论坛推荐《正在爆发的营销革命》
  • Android 架构优化~MVP 架构改造
  • Android 控件背景颜色处理
  • CentOS7简单部署NFS
  • export和import的用法总结
  • GitUp, 你不可错过的秀外慧中的git工具
  • mysql innodb 索引使用指南
  • React-生命周期杂记
  • seaborn 安装成功 + ImportError: DLL load failed: 找不到指定的模块 问题解决
  • windows-nginx-https-本地配置
  • 纯 javascript 半自动式下滑一定高度,导航栏固定
  • 分享自己折腾多时的一套 vue 组件 --we-vue
  • 浅谈Golang中select的用法
  • 突破自己的技术思维
  • 微信公众号开发小记——5.python微信红包
  • TPG领衔财团投资轻奢珠宝品牌APM Monaco
  • 阿里云服务器购买完整流程
  • ###51单片机学习(1)-----单片机烧录软件的使用,以及如何建立一个工程项目
  • #LLM入门|Prompt#3.3_存储_Memory
  • #我与虚拟机的故事#连载20:周志明虚拟机第 3 版:到底值不值得买?
  • (1综述)从零开始的嵌入式图像图像处理(PI+QT+OpenCV)实战演练
  • (LeetCode 49)Anagrams
  • (ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY)讲解
  • (含react-draggable库以及相关BUG如何解决)固定在左上方某盒子内(如按钮)添加可拖动功能,使用react hook语法实现
  • (理论篇)httpmoudle和httphandler一览
  • (论文阅读30/100)Convolutional Pose Machines
  • (十八)SpringBoot之发送QQ邮件
  • (转)IOS中获取各种文件的目录路径的方法
  • (转)清华学霸演讲稿:永远不要说你已经尽力了
  • (转)四层和七层负载均衡的区别
  • (转载)虚函数剖析
  • (轉貼) 資訊相關科系畢業的學生,未來會是什麼樣子?(Misc)
  • *(长期更新)软考网络工程师学习笔记——Section 22 无线局域网
  • .NET CLR Hosting 简介
  • .Net Core 中间件与过滤器
  • .NET Core中的去虚
  • .net 程序 换成 java,NET程序员如何转行为J2EE之java基础上(9)
  • .net和php怎么连接,php和apache之间如何连接