Rank()、dense_rank()、row_number()都是窗口函数,他们的主要作用是为每一行计算一个排名,常常与 order by 一起使用。
RANK() :返回一个数字,该数字表示在窗口内当前行的排名,排序相同时会重复,最后显示的总数不会变。
即如果有两个用户的值相同,则并列第一,那么下一个排名应该是第三名。
如:1-2-3-3-5-6
DENSE_RANK() :返回一个数字,该数字表示在窗口内当前行的排名,排序相同时会重复,下一个排名将被跳过,最后显示的总数会减少。
即如果有两个用户的值相同,则并列第一,那么下一个排名应该是第二名。
如:1-2-3-3-4-5
ROW_NUMBER() :返回一个数字,该数字表示在窗口内当前行的排名,会根据顺序计算,每行都有一个唯一的行号,从 1 开始,依次递增。如:1-2-3-4-5
综上所述,这三种函数的主要区别在于对于相同值的处理方式不同,rank()函数会并列排名,dense_rank()函数会跳过相同的排名,row_number()函数每行都有一个唯一的排名。