MySQL常用的排名函数有:ROW_NUMBER()、DENSE_RANK()、RANK()、NTILE()。
ROW_NUMBER()
ROW_NUMBER()函数用于把数据进行排序,每条数据会按照对应的条件要求排序后加上序号
示例:
SELECT ROW_NUMBER() over ( ORDER BY stu_score DESC ) s_rank, stu_name, stu_number, stu_score FROM students_score;
排序是按照分数降序排的,如图所示,即使出现分数相同,也是依次排序,序号是不会重复的。所以ROW_NUMBER()不能用于像学生成绩排名这样的排序要求。
DENSE_RANK()
DENSE_RANK()也是排名函数,对字段进行排名,和ROW_NUMBER()的区别,看示例:
示例:
SELECT DENSE_RANK() over ( ORDER BY stu_score DESC ) s_rank, stu_name, stu_number, stu_score FROM students_score;
如图所示DENSE_RANK()和ROW_NUMBER()排名结果都是连续的,但是当出现分数相同时,DENSE_RANK()的排名会出现相同的排名。
RANK()
RANK()也是对字段进行排名的函数。和DESNE_RANK()的区别在于,如果出现分数相同的数据时,DESNE_RANK()排名是连续的,RANK()则是跳跃的。
示例:
SELECT RANK() over ( ORDER BY stu_score DESC ) s_rank, stu_name, stu_number, stu_score FROM students_score;
NTILE()
NTILE()函数将排序分区中的行划分为特定数量的组。从每个组分配一个从一开始的桶号。对于每一行,NTILE()函数返回一个桶号,表示行所属的组。
语法:
NTILE(n) OVER (
PARTITION BY [{,…}]
ORDER BY [ASC|DESC], [{,…}]
)
n是一个字面正整数。桶号的范围是1到n。
在PARTITION BY从返回的结果集划分FROM子句为分区到的NTILE()函数被应用。
ORDER BY子句指定将NTILE()值分配给分区中的行的顺序。
请注意,如果分区行的数量不能被整除n,则NTILE()函数将生成两个大小的组,差异为1。较大的组总是以ORDER BY子句指定的顺序位于较小的组之前。
另一方面,如果分区行的总数可被整除n,则行将在组之间平均分配。
示例:
SELECT NTILE( 2 ) over ( ORDER BY stu_score DESC ) s_rank, stu_name, stu_number, stu_score FROM students_score;
SELECT NTILE( 3 ) over ( ORDER BY stu_score DESC ) s_rank, stu_name, stu_number, stu_score FROM students_score;
以上就是MySQL常见的几个排名函数,生产中可以根据实际情况选择对应的函数。