gpt4 book ai didi

mysql - 排名分数 Leetcode #178

转载 作者:可可西里 更新时间:2023-11-01 07:32:03 24 4
gpt4 key购买 nike

谁能帮忙解释一下如何解决这个问题?我是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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com