【刷题记录】4.分数排名

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

一、题目描述:

题目来源:LeetCode>分数排名

表:Scores

Column Name Type
id int
score decimal

Id是该表的主键。
该表的每一行都包含了一场比赛的分数。Score是一个有两位小数点的浮点值。

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

分数应按从高到低排列。

如果两个分数相等,那么两个分数的排名应该相同。

在排名相同的分数后,排名数应该是下一个连续的整数。换句话说,排名之间不应该有空缺的数字。

按score降序返回结果表。

查询结果格式如下所示。

示例 1:

输入:
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. 此题需要计算排名,可以直观的用两张相同的表进行查询、排名

  2. 第一张表用作排序后的数据进行输出,第二张表用于排名数据的输出

  3. 对于排名的统计,可以使用两张表关联,统计表1在表2中有多少条数据大于当前数据,例如:只有1条大于当前数据,则排名为1

  4. 统计排名的同时,为避免重复数据,需要使用distinct关键字,保证相同分数的数据排名是一致的

  5. 根据表1进行group by,不然只有一条数据

  6. 最后desc score 倒序输出

三、AC 代码:

SELECT
	s1.score,
	count( DISTINCT s2.score ) AS rank 
FROM
	scores AS s1,
	scores AS s2 
WHERE
	s1.score <= s2.score 
GROUP BY
	s1.id 
ORDER BY
	s1.score DESC;
复制代码

四、总结:

当一次性解决不了的时候,可以循序渐进式解决,例如以下思路:

  1. 首先是排序:
SELECT
	Score AS Score 
FROM
	Scores 
ORDER BY
	Score DESC
复制代码
  1. 第二部分是确定排名,这一部分比较难,我们可以假定有一个未知数X,那如果要取出大于等于X的数,则是:
SELECT
	Score 
FROM
	Scores 
WHERE
	Score >= X;
复制代码
  1. 再考虑重复数据的问题
SELECT
	count( DISTINCT Score ) 
FROM
	Scores
WHERE
	Score >= X AS Rank;
复制代码
  1. 最后是结合另一张表,综合起来得出最后答案
SELECT
	s1.score,
	count( DISTINCT s2.score ) AS rank 
FROM
	scores AS s1,
	scores AS s2 
WHERE
	s1.score <= s2.score 
GROUP BY
	s1.id 
ORDER BY
	s1.score DESC;
复制代码
© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享