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

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

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

示例:查询学生成绩排名

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

sql 复制代码
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、并列排名

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

以下是一个示例:

sql 复制代码
SET @rank := 0;
SET @prev_score := NULL;

SELECT
    student_id,
    score,
    @rank := IF(@prev_score = score, @rank, @rank + 1) AS rank,
    @prev_score := score
FROM
    scores
ORDER BY
    score DESC;

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

1.2、连续排名

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

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

sql 复制代码
SET @rank := 0;
SET @prev_score := NULL;
SET @rank_count := 1;

SELECT
    student_id,
    score,
    @rank := @rank + (@prev_score = score) * @rank_count AS rank,
    @prev_score := score,
    @rank_count := IF(@prev_score = score, @rank_count + 1, 1) 
FROM
    scores
ORDER BY
    score DESC;

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

2、MySQL 8.0及以上版本

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

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

sql 复制代码
  SELECT
      student_id,
      score,
      RANK() OVER (ORDER BY score DESC) AS rank
  FROM
      scores;

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

sql 复制代码
  SELECT
      student_id,
      score,
      DENSE_RANK() OVER (ORDER BY score DESC) AS rank
  FROM
      scores;

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

相关推荐
智购科技自动售货机工厂12 分钟前
2026自动售货机语音支付模块集成:从声纹识别到支付闭环的工程实践~YH
大数据·服务器·网络·数据库·人工智能
做一个AK梦1 小时前
论基于云原生数据库的企业信息系统架构设计
数据库·云原生
风哥2号1 小时前
PostgreSQL数据库恢复工具FGPDU(FGEDU PostgreSQL DUL)
数据库·postgresql
智购科技智能售货柜1 小时前
2026自动售货机峰值交易流量应对方案:从消息削峰到弹性扩容的工程实践~YH
数据库·人工智能·单片机·嵌入式硬件·yolo
JavaPub-rodert1 小时前
Ontop 详解:不搬数据库,也能把 MySQL / PostgreSQL 变成知识图谱
数据库·mysql·postgresql
xiaoxiang96092 小时前
Git 分支同步实战:`merge -X theirs` 与完全合并方案
数据库·git·elasticsearch
GoppViper2 小时前
用户测试如何提升SEO转化率?四种实操方法与案例解析
数据库·经验分享
先吃饱再说3 小时前
后端开发绕不开的 SQL:从建表、查询到索引优化,一篇讲透
数据库·后端·sql
敲代码的小小酥3 小时前
InfluxDB时序数据库(续)
数据库·时序数据库
智购科技自动贩卖机3 小时前
自动售货机嵌入式系统Go语言开发实践:从资源受限设备到RTOS协程调度的工程化之路
大数据·linux·数据库·人工智能·yolo·架构·golang