leetcode数据库算法题系列四:178. 分数排名(MySQL版)

阅读之前,请牛刀小试:https://leetcode-cn.com/problems/rank-scores/

本系列教程,基于19个案例来探索SQL编程的艺术。 SQL 是一门结构化查询语言,更是一门面向集合的语言。


一 、题目:分数排名

编写一个 SQL 查询来实现分数排名。如果两个分数相同,则两个分数排名(Rank)相同。请注意,平分后的下一个名次应该是下一个连续的整数值。换句话说,名次之间不应该有“间隔”。

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

应用场景

分数排名应用场景十分广泛,问题扩展是分组排名。分组排名,是多表关联时得情况,比单个表稍复杂。


二、准备:创建表插入数据

-- 创建表

-- drop table scores;
CREATE TABLE Scores (
	Id INT PRIMARY KEY,
	Score DECIMAL(5,2)
);
-- truncate table scores;
INSERT INTO Scores(id,score)VALUES 
(1,3.50),
(2,3.65),
(3,4.00),
(4,3.85),
(5,4.00),
(6,3.65);
-- 查询
select * from Scores


三、解法:条条大路

3.1 解法一 : 表自连接解法

这种解法已经在上一节 《第N高的薪水》中描述;这一节来探索那种SQL性能更优越。

表自关联解法求解排名

SELECT s1.Score,(SELECT COUNT(distinct(s2.Score)) 
                 FROM Scores s2 WHERE s1.Score < s2.Score) + 1 AS Rank
FROM Scores s1
ORDER BY s1.Score DESC;

自连接是SQL中十分场景的,且功能也十分强大,所以需要理解自连接的思想。

更多关于自连接的文章可以参考这篇文章,不重复造轮子 《sql进阶教程》之自连接的用法: https://blog.csdn.net/qq_31156277/article/details/84328536


通常自连接的性能都不高。 这条SQL 不管创建索引与否,循环次数不会少。

执行计划
查看这个查询的执行计划
leetcode数据库算法题系列四:178. 分数排名(MySQL版)_第1张图片


3.2 其他

排名,在其他数据库中能够使用函数快速解决,希望MySQL在未来的版本中增加多这个支持。

在第四道题中已经逐渐体现自连接的重要性,在后续的文章,自连接会大放异彩,所以,希望读者一定要理解自连接,且掌握自连接灵活的用法。

你可能感兴趣的:(mysql)