mysql - 排名分数 Leetcode #178

标签 mysql sql

谁能帮忙解释一下如何解决这个问题?我是sql初学者,不知道如何使用变量。

编写一个 SQL 查询来对给定 Scores 表的分数进行排名。如果两个分数相同,则两者的排名应该相同。请注意,在平局之后,下一个排名数字应该是下一个连续的整数值。换句话说,行列之间不应该有“空洞”。

Question Description

https://leetcode.com/problems/rank-scores/description/

我已经查看了论坛中的解决方案,但仍然无法理解其背后的逻辑。如果有人可以提供逐步解释,我们将不胜感激。 一种可能的解决方案是(没有变量):

select scores.Score, count(ranking.Score) as Rank
from scores, (select distinct Score from scores) ranking
where ranking.score>=scores.Score
group by scores.Id
order by scores.Score desc

谢谢!

最佳答案

让我们先看一下预期输入和输出的示例:

INPUT
+----+-------+
| Id | Score |
+----+-------+
| 1  | 3.50  |
| 2  | 3.65  |
| 3  | 4.00  |
| 4  | 3.85  |
| 5  | 4.00  |
| 6  | 3.65  |
+----+-------+

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

因此,任务是将所有相同的分数分组,然后将它们从大到小排序。让我们逐步了解您提到的解决方案如何实现它。首先,它创建一个名为 ranking 的帮助表- 注意 (select distinct Score from scores) ranking .其内容将是:

+----+--+
| Score |
+----+--+
| 3.50  |
| 3.65  |
| 4.00  |
| 3.85  |        
+----+--+

注意如何消除所有重复分数(这是 distinct 关键字的目的)。接下来,表之间有一个连接 rankingscores (隐藏在 where 部分)我们加入来自 scores 的每条记录包含来自 ranking 的所有记录的表格具有更大或相等分数的表。因此,这个中期阶段的结果将是:

+----+-------+---------+
| Id | Score | r.Score |
+----+-------+---------+
| 1  | 3.50  | 3.50    |
| 1  | 3.50  | 3.65    |
| 1  | 3.50  | 3.85    |
| 1  | 3.50  | 4.00    |
| 2  | 3.65  | 3.65    |
| 2  | 3.65  | 3.85    |
| 2  | 3.65  | 4.00    |
| 3  | 4.00  | 4.00    |
| 4  | 3.85  | 3.85    |
| 4  | 3.85  | 4.00    |
| 5  | 4.00  | 4.00    |
| 6  | 3.65  | 3.65    |
| 6  | 3.65  | 3.85    |
| 6  | 3.65  | 4.00    |
+----+-------+---------+

接下来是 group by它将所有具有相同 Id 的记录分组成一个记录。由于在 select我们有一部分 count(ranking.Score) ,分组的结果就是每个Id的不同排名分数的计数.自从我们从 ranking 加入以来只有那些大于或等于原始分数的分数,这个计数才会给出请求的排名。我们快完成了:

+----+-------+--------+-------+
| Id | count(r.Score) | Score |
+----+-------+--------+-------+
| 1  |       4        | 3.50  |
| 2  |       3        | 3.65  |
| 3  |       1        | 4.00  |
| 4  |       2        | 3.85  |
| 5  |       1        | 4.00  |
| 6  |       3        | 3.65  |
+----+-------+--------+-------+

现在是最简单的部分 - order by按分数对结果排序。自 select不包括 Id ,该列被省略,我们得到最终结果。希望这对您有所帮助!

附言因为我们使用的是MySQL,所以可以省略scores.Score来自 group by部分并仍然在 select 中使用它- 这在其他 SQL 引擎中是不允许的。你表示你是初学者所以不要太担心这个,只是为了完整性而提到它。

关于mysql - 排名分数 Leetcode #178,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48837762/

相关文章:

mysql - 如何有效地聚合 View 中的相关对象计数?

SQL Server 查询排名 (RowNumber) 和分组

mysql - AWS 的站点到站点 OpenSWAN VPN 隧道问题

php - MySQL group concat used with 2 join table 查询结果重复

mysql - SQL 检查记录之一是否不存在并加入其他表

mysql - 数据库太大 - 存储为行或序列化数据?

mysql - 对相同列的严格约束不能按预期工作

MySQL查询联表数据

MySQL - = ""和 != ""关于 null 的不同行为

sql - 创建 TableView ,对行中的所有列和行名称等于列名称的列的所有行求和