MySQL8.0窗口函数之排名函数(rankdense_rank)的使用
Posted 最小的帆也能远航
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL8.0窗口函数之排名函数(rankdense_rank)的使用相关的知识,希望对你有一定的参考价值。
静态窗口函数之排名函数 rank()、dense_rank()
- 有成绩表sc,字段分别是学生编号s_id,课程编号c_id,成绩score
题目:按成绩从高到低进行排名
代码:
select * ,rank() over(order by score desc) 名次 from sc;
代码解读:rank()是排名函数,不需要参数;over语句里面没有partition by参数,也就是整个数据视为一个窗口;因为rank函数没有参数,但需要指定按照那个字段进行排名,所以使用rank函数必须用order by参数,排序字段就是排名字段,针对分数做降序,就会按照成绩从高到低进行排名;rank函数属于静态窗口,第三个参数写不写没有任何用处。
结果如下,发现80分的同学都是并列第六,而并列后的下一位同学的名次是11名
但有时候,当出现名次并列时,下一个人的名次是连续的,只需要将rank()函数换成dense_rank(),其他都不需要更改。
代码:
select * ,dense_rank() over(order by score desc) 名次 from sc;
结果如下:
题目:求每门课程的成绩排名
代码:
select * ,rank() over(partition by c_id order by score desc) 名次 from sc;
代码解读:因为要求的是每门课程的排名,也就是课程1和课程2之间相互不影响,需要按照c_id将成绩表分成多份,每个课程是一个窗口,窗口内进行排序并返回排名,最后将多个窗口的结果再拼接再一起。
结果如下:
题目:查询每位学生的成绩总分并排名
代码:
SELECT
s_id,
sum( score ) 总成绩,
rank() over ( ORDER BY sum( score ) DESC ) 排名
FROM
sc
GROUP BY
s_id;
代码解读:开窗函数的执行顺序是在group by之后的,所以是先针对s_id分组后聚合,得出每个学生的总成绩,之后再执行窗口函数。over语句没有partition by语句,没有进行分窗, 针对总成绩进行排序,根据每个学生的总成绩进行排名。
结果如下:
以上是关于MySQL8.0窗口函数之排名函数(rankdense_rank)的使用的主要内容,如果未能解决你的问题,请参考以下文章
mysql相邻行数据计算的自定义变量@和Lead窗口函数的具体案例适应版本mysq5.7 mysql8.0