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)的使用的主要内容,如果未能解决你的问题,请参考以下文章

MySQL8.0窗口函数实践及小结

Mysql8.0新增的排名函数

MySQL8.0 JSON函数之搜索JSON值

mysql相邻行数据计算的自定义变量@和Lead窗口函数的具体案例适应版本mysq5.7 mysql8.0

Mysql8.0出现的窗口函数row_number(),rank(),dense_rank()用于排序的查询

MySQL 8.0 新增SQL语法对窗口函数和CTE的支持