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

1,474 阅读2分钟

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

一、题目描述:

题目来源:LeetCode>分数排名

表:Scores

Column NameType
idint
scoredecimal

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

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

分数应按从高到低排列。

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

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

按score降序返回结果表。

查询结果格式如下所示。

示例 1:

输入: Scores 表:

idscore
13.50
23.65
34.00
43.85
54.00
63.65

输出:

scorerank
4.001
4.001
3.852
3.653
3.653
3.504

二、思路分析:

  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;