mysql 8.0 自定义函数_MySQL排序rank

ba8a9b562a28b67250625fe4efd61eda.png

在数据库中对数据进行操作的时候,经常要进行排序,比如成绩表中要按照成绩排名等,由于MySQL没有开窗函数,不能直接使用排序rank函数,今天分享2个MySQL中进行的排序的操作。

一:自变量法排序

首先在MySQL中建一个成绩表(score)如下,mark 为分数,并没有order by排序,在后面进行排序操作的时候首先要对mark进行排序,并且为降序desc。

a808e795c37172165bbcf3c7af20b1c8.png

对成绩表进行排名,分数最高的为1,如果2个分数相同,则排名相同,我们想得到的结果如下

43c3975cfd7237bc26c2e9a8f5a5f3ea.png

代码如下(使用Navicat):

8ab6db1b32635996cbbd01d919b2fd64.png

对上述代码进行解释,第9行为排序,降序为desc,设置自定义变量2个,分别是@r和@m,其中第7行和第10行为自定义变量赋值。mysql中对自定义变量的赋值是(:=),比如@r:=1,判断自定义变量是否等于值mark,代码为@m=mark。(如果有同学对自定义变量不清楚,可以再详查相关解释)

我在Navicat上遇到一个很有意思的问题,将排名rank_mark字段名设置为rank或者Rank的时候,都会报错,有同学遇到类似问题的时候可以注意下。

a63b06ac8eef094ea3aebb9b11f4bdeb.png

如果是希望排名不连续,得到下面的结果

113fcbe0de1c9e86f8fce588bd2a66cd.png

代码如下:

53e9a7e39d1a95c804272a4c580f2aec.png

排名还有很多其他情况,比如按照班级对成绩进行排名,还要判断班级是否一样,这样的情况,在多加一个if()判断就可以,MySQL进行排序的核心是合理利用自定义变量,难点是自定义变量赋值和判断自定义变量是否等于某一值,要注意冒号:的使用。

二 自交法排序(左交法)

自交法意思是自己和自己对比,看比自己分数高的有几个,比如有下列数据,8个学生的成绩需要从高到低排序,输出列有sno,degree,rank_degree

95694515a092d7d9cd1cf5c64cfba518.png
数据源

代码展示:

8f4aacd8ff2ab14bfd4b620dc85ca5cf.png

对自交法的解释:给a表的每个sno的degree,看b表中有多少个degree大于a表该sno的degree,比如最高分的sno,b表中大于其的数量为0,最低分的sno,b表中大于其的数量为总数-1(除去自己,其余的分数都比自己高)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值