mysql 排名

本文介绍了在MySQL中手动实现排名函数的方法,包括使用子查询和条件判断,以及MySQL8.0及以上版本引入的内置RANK()函数。对比了两种方法在不同版本下的适用性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

时间:2022-01-08 11:21:38

1. 手动实现rank函数

 

MySQL中不存在类似于SQL Server或Orcal中的rank()函数来得到排名。而在实际的工作中,常常需要将查询后排序得到的排名给记录下来。由于项目需要,不仅要对成绩进行排名,而且需要相同成绩的具有相同的排名。根据网上的提供的排名方法,进一步进行扩充,得到了下面的实现方式。

表:score,有三个字段,id,name,score

表中原始数据:

 

365e5bccc74057d70690f9ac27bc11e7.png

select 
tmp.id,tmp.name,tmp.score,
-- 顺序一直在变大
@j:=@j+1 as j,
-- 只有在前后二次排序值不同时才会使用顺序号
@k:=(case when @pre_score=tmp.score then @k else @j end) as rank,
@pre_score:=tmp.score as pre_score
from 
(
-- 成绩排序
select * from score order by score desc
) tmp,
-- @k 表示最终的排名(相同值时序号相同) 
-- @j 表示顺序排名 
-- @pre_score上一次排序值
(select @k :=0,@j:=0, @pre_score:=0) sdcore

 

f4db3b0aa99abc2c472f3e4772e8adbe.png

2. 8.0自带的rank函数

在MySQL8.0推出Rank排名函数RANK,完全支持这种需求,但是必须MySQL8.0 以上版本才支持这个特性。8.0以下的版本有什么方法实现呢,使用用户变量,记录名次。

rank()函数可用于为结果集分区中的每一行提供排名。

首先,让我们创建一个表-将记录插入表中。

create table RankDemo
(
id int
);

insert into RankDemo values(1);
insert into RankDemo values(3);
insert into RankDemo values(3);
insert into RankDemo values(4);
insert into RankDemo values(5);

在select语句的帮助下显示表中的所有记录。查询如下-
以下是输出。

现在让我们应用上面讨论过的rank()函数。

SELECT id,RANK() OVER (ORDER BY id ) Ranking from RankDemo;

以下是显示排名的输出。
+------+---------+
| id   | Ranking |
+------+---------+
|    1 |       1 |
|    3 |       2 |
|    3 |       2 |
|    4 |       4 |
|    5 |       5 |
+------+---------+

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值