力扣数据库算法178. 分数排名

SQL:

select s1.score, 
        (select count(distinct s2.score) 
        from scores s2 
        where s2.score >= s1.score) as 'rank'
from scores s1 
order by s1.score desc

描述:

表: Scores

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

编写一个解决方案来查询分数的排名。排名按以下规则计算:

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

按 score 降序返回结果表。

示例:

输入: 
Scores 表:
+----+-------+
| id | score |
+----+-------+
| 1  | 3.50  |
| 2  | 3.65  |
| 3  | 4.00  |
| 4  | 3.85  |
| 5  | 4.00  |
| 6  | 3.65  |
+----+-------+
输出: 
+-------+------+
| score | rank |
+-------+------+
| 4.00  | 1    |
| 4.00  | 1    |
| 3.85  | 2    |
| 3.65  | 3    |
| 3.65  | 3    |
| 3.50  | 4    |
+-------+------+

分析:

这道题其实就是对分数的排名进行一个查询,而且并无排名跳跃的情况,即若两人并列第一,则第三个人排名为第二而不是第三,对于这种情况就需要用去重的查询,可以用第二张表与第一张表的分数进行对比,若大于等于第一张表的分数有1个,就说明只有他本身这个分数即第一名,若大于等于的有两个,说明有一个分数比他大,另一个分数就是他本身,所以他是第二名,由此得出查询排名的SQL:

(select count(distinct s2.score) 
 from scores s2 
 where s2.score >= s1.score) as 'rank'

最后再对分数做降序处理即可:

select s1.score, 
        (select count(distinct s2.score) 
        from scores s2 
        where s2.score >= s1.score) as 'rank'
from scores s1 
order by s1.score desc

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值