178.分数排名

题目描述

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

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

解题思路

1. 分表查询

  1. 每个分数的排名
select distinct score
from Scores
order by score desc
  1. 分数X的排名
select count(score)
from Scores
order by score desc
where score>=X
  1. 整合两部分
select a.score score,
(select count(distinct b.score) from Scores b where a.score <= b.score) as `rank`
# 注意现在 rank 不加反引号`` 会报错
from Scores a
order by score desc

2. 窗口函数

  1. 窗口函数使用
    函数名([参数]) over(partition by [分组字段] order by [排序字段] asc/desc rows/range
  2. 窗口函数有关排名的算法
  • row_number(): 同薪不同名,相当于行号,例如3000、2000、2000、1000排名后为1、2、3、4
  • rank(): 同薪同名,有跳级,例如3000、2000、2000、1000排名后为1、2、2、4
  • dense_rank(): 同薪同名,无跳级,例如3000、2000、2000、1000排名后为1、2、2、3
posted @ 2023-01-08 20:30  信计一班王同学  阅读(82)  评论(0)    收藏  举报