LeetCode-SQL高手挑战】—178. 分数排名

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
简介: LeetCode-SQL高手挑战】—178. 分数排名

📢📢📢📣📣📣

哈喽!大家好,我是【IT邦德】,江湖人称jeames007,10年DBA工作经验

一位上进心十足的【大数据领域博主】!😜😜😜

中国DBA联盟(ACDU)成员,目前从事DBA及程序编程

擅长主流数据Oracle、MySQL、PG 运维开发,备份恢复,安装迁移,性能优化、故障应急处理等。

✨ 如果有对【数据库】感兴趣的【小可爱】,欢迎关注【IT邦德】💞💞💞

❤️❤️❤️感谢各位大可爱小可爱!❤️❤️❤️

image.png

文章目录



🐴 1.SQL题目概述

表结构: Scores
+-------------+---------+
| Column Name | Type    |
+-------------+---------+
| id          | int     |
| score       | decimal |
+-------------+---------+
Id是该表的主键。
该表的每一行都包含了一场比赛的分数。Score是一个有两位小数点的浮点值。

🚀题目:


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

1.分数应按从高到低排列。

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

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

4.按 score 降序返回结果表。

🚩查询结果如下例所示
输入: 
Scores 表:
+----+-------+
| id | score |
+----+-------+
| 1  | 3.50  |
| 2  | 3.65  |
| 3  | 4.00  |
| 4  | 3.85  |
| 5  | 4.00  |
| 6  | 3.65  |
+----+-------+
输出: 
+-------+------+
| score | rank |
+-------+------+
| 4.00  | 1    |
| 4.00  | 1    |
| 3.85  | 2    |
| 3.65  | 3    |
| 3.65  | 3    |
| 3.50  | 4    |
+-------+------+

🐴 2.解题思路


MySQL8.0 中可以利用 DENSE_RANK()个窗口函数实现上述排名,

需要注意的一点是 as 后的别名,千万不要与前面的函数名重名,否则会报错

Oracle中直接有对应的开窗函数 DENSE_RANK()处理

邦德这里使用了数据库自带的开窗函数来解题,如果小伙伴们还有其他解题思路,欢迎评论区留言交流~

image.png

🐴 3.方法实现


🌈Oracle实现

select score,dense_rank() over(order by score desc) rank from Scores;

🌈MySQL实现

SELECT score,
DENSE_RANK() OVER w AS ‘rank’,
FROM Scores
WINDOW w AS (ORDER BY score desc);

🐴 4.代码测试


🌈Oracle实现

执行代码,开始测试

image.png


与测试结果一致,测试成功!

image.png


🌈MySQL实现

执行代码,开始测试

image.png

与测试结果一致,测试成功!

image.png

🐴 5.知识点小结

🌀开窗函数语法
function_name(,…) over(<partition_Clause><windowing_Clause>);
function_name():函数名称
argument:参数
over( ):开窗函数
partition_Clause:分区子句,数据记录集分组,group by…
order by_Clause:排序子句,数据记录集排序,order by…
windowing_Clause:开窗子句,定义分析函数在操作行的集合,三种开窗方式:rows、range、Specifying
注:使用开窗子句时一定要有排序子句!!!
————————————————
🌀常用分析函数
row_number() over(partition by … order by …)
rank() over(partition by … order by …)
dense_rank() over(partition by … order by …)
count() over(partition by … order by …)
max() over(partition by … order by …)
min() over(partition by … order by …)
sum() over(partition by … order by …)
avg() over(partition by … order by …)
first_value() over(partition by … order by …)
last_value() over(partition by … order by …)
lag() over(partition by … order by …)
lead() over(partition by … order by …)
相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
6月前
|
SQL
leetcode-SQL-1407. 排名靠前的旅行者
leetcode-SQL-1407. 排名靠前的旅行者
52 1
|
6月前
leetcode-1447:最简分数
leetcode-1447:最简分数
46 0
|
6月前
|
SQL HIVE
【Hive SQL 每日一题】分组排名取值
创建了一个名为`sales_data`的测试表,包含商品ID、销售额和销售日期。展示了部分示例数据。接着,提供了三个SQL查询:1) 查找每个商品销售额最高的记录;2) 获取每个商品最近和最远的销售记录;3) 求每个商品距今第二近的销售记录。每个查询都利用了窗口函数来处理数据,并给出了相应的查询结果图。
87 1
|
6月前
|
SQL
SQL 查找入职员工时间排名倒数第三的员工所有信息
SQL 查找入职员工时间排名倒数第三的员工所有信息
|
6月前
|
算法 测试技术 C#
【贪心算法】【中位贪心】LeetCode:100123.执行操作使频率分数最大
【贪心算法】【中位贪心】LeetCode:100123.执行操作使频率分数最大
|
6月前
|
算法 测试技术 C#
二分查找|差分数组|LeetCode2251:花期内花的数目
二分查找|差分数组|LeetCode2251:花期内花的数目
|
6月前
leetcode-856:括号的分数
leetcode-856:括号的分数
38 0
|
6月前
leetcode-592:分数加减运算
leetcode-592:分数加减运算
51 0
|
6月前
|
SQL
leetcode-SQL-1988. 找出每所学校的最低分数要求
leetcode-SQL-1988. 找出每所学校的最低分数要求
28 0
|
6月前
leetcode-1984:学生分数的最小差值
leetcode-1984:学生分数的最小差值
45 0