首页 > 数据库技术 > 详细

小白养成记——MySQL中的排名函数

时间:2021-01-19 19:41:05      阅读:23      评论:0      收藏:0      [点我收藏+]

1.ROW_NUMBER() 函数

依次排序,没有并列名次。如

SELECT st.ID 学号, st.`NAME` 姓名, sc.SCORE 成绩, ROW_NUMBER() OVER(ORDER BY sc.SCORE DESC) 排名
FROM Student st
LEFT JOIN Score sc ON sc.STUDNET_ID = st.ID

查询结果为

技术分享图片

可以看出,尽管存在相同的成绩(98.0、91.0),但是排名并没有并列,而是按顺序依次排号。

 

2.RANK() 函数

有并列名次,且并列名次会占用序号,因此名次之间可能会有间隔。如

SELECT st.ID 学号, st.`NAME` 姓名, sc.SCORE 成绩, RANK() OVER(ORDER BY sc.SCORE DESC) 排名
FROM Student st
LEFT JOIN Score sc ON sc.STUDNET_ID = st.ID

查询结果为

技术分享图片

可以看出,相同的成绩(98.0、91.0)的排名是相同的(并列第2名、并列第5名),且并列的名次会占用序号,因此与它下一个名次之间会有间隔。

显然这种结果是最符合实际生活中的排名的。

 

3.DENSE_RANK() 函数

 有并列名次,但并列名次不占用序号,因此名次都是紧密相连的。如

SELECT st.ID 学号, st.`NAME` 姓名, sc.SCORE 成绩, DENSE_RANK() OVER(ORDER BY sc.SCORE DESC) 排名
FROM Student st
LEFT JOIN Score sc ON sc.STUDNET_ID = st.ID

查询结果为

技术分享图片

可以看出,相同的成绩(98.0、91.0)的排名是相同的(并列第2名、并列第5名),但并列的名次并会占用序号,因此与它下一个名次之间没有间隔,所有名次都是紧密相连的。

 

 

4.NTILE() 函数

NTILE(n) 函数可以将返回的结果排序,如

SELECT st.ID 学号, st.`NAME` 姓名, sc.SCORE 成绩, NTILE(4) OVER(ORDER BY sc.SCORE DESC) 组号
FROM Student st
LEFT JOIN Score sc ON sc.STUDNET_ID = st.ID

表示将成绩按从大到小排序后,把结果分为4组。由于总记录数为8条,因此每组会有2条记录:

技术分享图片

这样每组的记录数是均匀的。

但如果查询结果的总记录数不能被指定的要分的组的总数整数,则分得的每组中的记录数是不均匀的,如

SELECT st.ID 学号, st.`NAME` 姓名, sc.SCORE 成绩, NTILE(3) OVER(ORDER BY sc.SCORE DESC) 组号
FROM Student st
LEFT JOIN Score sc ON sc.STUDNET_ID = st.ID

技术分享图片

由于 8 不能被 3 整除,因此得到的 3 组中每组的记录数不是完全一样的,而是按照 3、3、2 分配的,即"尽量"保证了均匀。

 

小白养成记——MySQL中的排名函数

原文:https://www.cnblogs.com/ideal2015/p/14296604.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!