想要精通算法和SQL的成长之路 - 分数排名(SQL)

想要精通算法和SQL的成长之路 - 分数排名(SQL)

前言

想要精通算法和SQL的成长之路 - 系列导航

一. 分数排名

原题链接我们先准备一张Scores表,表结构如下:
在这里插入图片描述
编写 SQL 查询对分数进行排序。排名按以下规则计算:

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

在这里插入图片描述

1.1 计算单个分数的排名

一个人的分数排名,就看有多少个人的分数是比他高的。假设一个人的分数是X

select count(*) from Scores where score >= X

由于题目要求:相同分数的人,他们的排名是一样的,因此我们这里要做个去重

select count(DISTINCT(score)) from Scores where score >= X

1.2 整合倒序排序

根据排名从大到小排序,SQL就很简单:

select score from Scores order by score desc;

结果如下:
在这里插入图片描述
可见,这时候我们只要结合1.1节的内容,再添加一列rank即可。只不过这个时候,可能需要用到临时表,因为我们上面还有个变量X呢。

首先我们将1.1节的SQL稍微修改下:

(select count(DISTINCT(a.score)) from Scores a where a.score >= X ) as rank

那么这个X从哪来,它还是来自于Scores表中的score

select b.score from Scores b order by b.score desc;

X也就是上面的b.score,那么将两个SQL嵌套在一起就是:

SELECT b.score,( SELECT count( DISTINCT ( a.score )) FROM Scores a WHERE a.score >= b.score ) AS rank 
FROM
	Scores b 
ORDER BY
	b.score DESC;

备注:Mysql中有一个名叫rank()的函数,因此leetcode里面跑代码的时候可能会出错,在于rank的别名。可以将其改为:AS ‘rank’,加个单引号即可。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Zong_0915

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值