大家好,我是空空star,本篇带你了解一道简单的力扣sql练习题。
文章目录
- 前言
- 一、题目:178. 分数排名
- 二、解题
- 1.错误示范①
- 提交SQL
- 运行结果
- 2.错误示范②
- 提交SQL
- 运行结果
- 3.正确示范①
- 提交SQL
- 运行结果
- 4.正确示范②
- 提交SQL
- 运行结果
- 5.正确示范③
- 提交SQL
- 运行结果
- 6.其他
- 总结
前言
一、题目: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 ) colfrom(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 ) colfrom(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