leetcode-178. 分数排名

  • 题目

SQL架构:

Create table If Not Exists Scores (Id int, Score DECIMAL(3,2))
Truncate table Scores
insert into Scores (Id, Score) values ('1', '3.5')
insert into Scores (Id, Score) values ('2', '3.65')
insert into Scores (Id, Score) values ('3', '4.0')
insert into Scores (Id, Score) values ('4', '3.85')
insert into Scores (Id, Score) values ('5', '4.0')
insert into Scores (Id, Score) values ('6', '3.65')

编写一个 SQL 查询来实现分数排名。如果两个分数相同,则两个分数排名(Rank)相同。请注意,平分后的下一个名次应该是下一个连续的整数值。换句话说,名次之间不应该有“间隔”。

±—±------+
| Id | Score |
±—±------+
| 1 | 3.50 |
| 2 | 3.65 |
| 3 | 4.00 |
| 4 | 3.85 |
| 5 | 4.00 |
| 6 | 3.65 |
±—±------+
例如,根据上述给定的 Scores 表,你的查询应该返回(按分数从高到低排列):

±------±-----+
| Score | Rank |
±------±-----+
| 4.00 | 1 |
| 4.00 | 1 |
| 3.85 | 2 |
| 3.65 | 3 |
| 3.65 | 3 |
| 3.50 | 4 |
±------±-----+

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/rank-scores
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

  • 分析

首先这是一个排序,然后需要对排序的名次做一个修改,因为一般的排序对于相同的元素其实是区分了先后次序的,而这个先后次序是会影响名次的,因此我们可以通过distinct消除这个先后次序带来的影响。并且排序过后的记录虽然有序,但是其名次还要需要字段Rank(原表不存在,所以需要用到as来将其表示出来)指示,而对于名次一般是采用各个值相互比较的方法来求得。
详细分析见代码。

  • 代码
# Write your MySQL query statement below
#大前提下对score进行排序,再在结果的表中添加Rank字段
#Rank的确定要靠score值的比较来确定,所以要指定原表的两个别名s1,s2以方便比较
#利用关键字已去除重复score的影响(即order的影响)
select s1.Score , count(distinct(s2.Score)) as Rank from Scores s1, Scores s2
where s1.Score<=s2.Score group by s1.Id
order by Score desc;

在这里插入图片描述
2019.12.15

发布了52 篇原创文章 · 获赞 59 · 访问量 6833

猜你喜欢

转载自blog.csdn.net/ataraxy_/article/details/103546617