时间:2022-01-08 11:21:38
1. 手动实现rank函数
MySQL中不存在类似于SQL Server或Orcal中的rank()函数来得到排名。而在实际的工作中,常常需要将查询后排序得到的排名给记录下来。由于项目需要,不仅要对成绩进行排名,而且需要相同成绩的具有相同的排名。根据网上的提供的排名方法,进一步进行扩充,得到了下面的实现方式。
表:score,有三个字段,id,name,score
表中原始数据:
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
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 |
+------+---------+