mysql中的排名函数rank()、dense_rank()、row_number()

排名函数rank()、dense_rank()、row_number()的比较

1、问题描述

在写LeetCode178. 分数排名时,它的要求是输出“无间隔”的分数排名,于是本文主要记录rank()、row_number()、dense_rank()三个排名函数的差异。

1.1 表样式示例:score表
Id Score
编号 分数

mysql中的排名函数rank()、dense_rank()、row_number()_第1张图片

2、rank()

2.1 作用

按照某字段的排序结果添加排名,但它是跳跃的、间断的排名,例如两个并列第一名后,下一个是第三名。

2.2 示例代码
SELECT Score,rank() over(ORDER BY Score desc) as 'Rank'
FROM score
2.3 查询结果

mysql中的排名函数rank()、dense_rank()、row_number()_第2张图片

3、 row_number()

3.1 作用

它是将某字段按照顺序依次添加行号。

3.2 示例代码
SELECT Score,row_number() over(ORDER BY Score desc) as 'Rank'
FROM score
3.3 查询结果

mysql中的排名函数rank()、dense_rank()、row_number()_第3张图片

4、dense_rank()

4.1 作用

dense 英语中指“稠密的、密集的”。dense_rank()是的排序数字是连续的、不间断。当有相同的分数时,它们的排名结果是并列的,例如,1,2,2,3。

4.2 示例代码
SELECT Score,dense_rank() over(ORDER BY Score desc) as 'Rank'
FROM score
4.3 查询结果

mysql中的排名函数rank()、dense_rank()、row_number()_第4张图片

5、总结

函数名 关键词 作用 主要适用场景
rank() 间断不连续 按顺序输出排名结果,每当出现一个并列结果,则下一个排名数字向后递增一位。 在并列结果中,每个并列成绩都要占用一个名额的场景
dense_rank() 连续 按数学输出排名的名次。当出现并列结果时,下一个名次应该是下一个连续的整数值。换句话说,名次之间不应该有“间隔”。 当排序结果存在并列成绩时,需要下一个名次于上一个名次是连续整数的情况。
row_number() 行号 按顺序输出表的行号 需要输出表的行号时

你可能感兴趣的:(MySQL)