(点击上方蓝色,快速关注)
SQL刷题系列:SQL作为一种数据库查询和程序设计语言,是从事数据技术人员必备的技能,也是各大公司的数据分析、数据挖掘、数据库等笔试题必考的一种题。所以,不论大家是转行还是学习都少不了这一关。为此,Python数据科学开启了SQL刷题的系列,希望可以帮助有需要的朋友们。 题目来源:本篇内容为Leetcode上SQL题库178 难易程度:中
▌题目描述
Write a SQL query to rank scores. If there is a tie between two scores, both should have the same ranking. Note that after a tie, the next ranking number should be the next consecutive integer value. In other words, there should be no "holes" between ranks.
编写一个 SQL查询来对分数排名。如果两个分数相同,那么两个分数应该有同样的排名。但也请注意,如果平分,那么下一个名次应该是下一个连续的整数值。换句话说,名次之间没有“间隔”。
+----+-------+
| 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 |
+-------+------+
▌参考答案
SELECT Score,
(
SELECT COUNT(DISTINCT b.Score) + 1
FROM Scores AS b
WHERE b.Score > Scores.Score
LIMIT 1
) AS Rank
FROM Scores order by Rank ;
▌答案解析
上面参考答案的思路是:利用表自连接。当查询表的每个分数时,都查找比这个分数大的其它分数的个数(不含重复值),然后在这个个数上加1,最后得到的个数就是每个分数的rank。最后用order by将rank排序即可。逻辑上有点类似于两个for的嵌套循环。