力扣-分数排名

大家好,我是空空star,本篇带你了解一道简单的力扣sql练习题。


前言


一、题目:178. 分数排名

表: Scores

+-------------+---------+
| Column Name | Type    |
+-------------+---------+
| id          | int     |
| score       | decimal |
+-------------+---------+
Id是该表的主键。
该表的每一行都包含了一场比赛的分数。Score是一个有两位小数点的浮点值。

编写 SQL 查询对分数进行排序。排名按以下规则计算:

  • 分数应按从高到低排列。
  • 如果两个分数相等,那么两个分数的排名应该相同。
  • 在排名相同的分数后,排名数应该是下一个连续的整数。换句话说,排名之间不应该有空缺的数字。

按 score 降序返回结果表。

查询结果格式如下所示。

二、解题

1.错误示范①

提交SQL

select score,row_number() over(order by score desc ) 'rank'
from Scores

运行结果

错在了两个分数相等时,两个分数的排名不相同。

2.错误示范②

提交SQL

select score,
rank() over(order by score desc) 'rank'
from Scores

运行结果

错在排名之间有空缺的数字

3.正确示范①

提交SQL

select u1.score,u2.col 'rank'
from Scores u1
left join (
    select score,row_number() over(order by score desc ) col
    from(
        select distinct score 
        from Scores
    ) a
) u2
on u1.score=u2.score
order by u2.col   

运行结果

按照计算好的排名升序

left join 也可以改为join

4.正确示范②

提交SQL

select u1.score,u2.col 'rank'
from Scores u1
join (
    select score,row_number() over(order by score desc ) col
    from(
        select distinct score 
        from Scores
    ) a
) u2
on u1.score=u2.score
order by u1.score desc

运行结果

按照分数降序

5.正确示范③

提交SQL

select score,
dense_rank() over(order by score desc) 'rank'
from Scores

运行结果

dense_rank函数的功能与rank函数类似,dense_rank函数在生成序号时是连续的,而rank函数生成的序号有可能不连续。dense_rank函数出现相同排名时,将不跳过相同排名号,rank值紧接上一次的rank值。在各个分组内,rank()是跳跃排序,有两个第一名时接下来就是第三名,dense_rank()是连续排序,有两个第一名时仍然跟着第二名。

6.其他


总结

row_number:顺序排序
rank:并列排序,会跳过重复的序号,比如序号为1、1、3
dense_rank:并列排序,不会跳过重复的序号,比如序号为1、1、2

猜你喜欢

转载自blog.csdn.net/weixin_38093452/article/details/129085943