SQL实现LeetCode(178.分数排行)


Posted in MySQL onAugust 04, 2021

[LeetCode] 178.Rank Scores 分数排行

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.

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

For example, given the above Scores table, your query should generate the following report (order by highest score):

+-------+------+
| 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 Score) FROM Scores WHERE Score >= s.Score) Rank 
FROM Scores s ORDER BY Score DESC;

跟上面的解法思想相同,就是写法上略有不同:

解法二:

SELECT Score,
(SELECT COUNT(*) FROM (SELECT DISTINCT Score s FROM Scores) t WHERE s >= Score) Rank
FROM Scores ORDER BY Score DESC;

下面这种解法使用了内交,Join是Inner Join的简写形式,自己和自己内交,条件是右表的分数大于等于左表,然后群组起来根据分数的降序排列,十分巧妙的解法:

解法三:

SELECT s.Score, COUNT(DISTINCT t.Score) Rank
FROM Scores s JOIN Scores t ON s.Score <= t.Score
GROUP BY s.Id ORDER BY s.Score DESC;

下面这种解法跟上面三种的画风就不太一样了,这里用了两个变量,变量使用时其前面需要加@,这里的:= 是赋值的意思,如果前面有Set关键字,则可以直接用=号来赋值,如果没有,则必须要使用:=来赋值,两个变量rank和pre,其中rank表示当前的排名,pre表示之前的分数,下面代码中的<>表示不等于,如果左右两边不相等,则返回true或1,若相等,则返回false或0。初始化rank为0,pre为-1,然后按降序排列分数,对于分数4来说,pre赋为4,和之前的pre值-1不同,所以rank要加1,那么分数4的rank就为1,下面一个分数还是4,那么pre赋值为4和之前的4相同,所以rank要加0,所以这个分数4的rank也是1,以此类推就可以计算出所有分数的rank了。

解法四:

SELECT Score,
@rank := @rank + (@pre <> (@pre := Score)) Rank
FROM Scores, (SELECT @rank := 0, @pre := -1) INIT 
ORDER BY Score DESC;

参考资料:

https://leetcode.com/discuss/40116/simple-short-fast

到此这篇关于SQL实现LeetCode(178.分数排行)的文章就介绍到这了,更多相关SQL实现分数排行内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

MySQL 相关文章推荐
Windows10下安装MySQL8
Apr 06 MySQL
MySQL REVOKE实现删除用户权限
Jun 18 MySQL
MySQL系列之四 SQL语法
Jul 02 MySQL
浅谈MySQL之select优化方案
Aug 07 MySQL
mysql5.7的安装及Navicate长久免费使用的实现过程
Nov 17 MySQL
MySQL图形化管理工具Navicat安装步骤
Dec 04 MySQL
Mysql如何实现不存在则插入,存在则更新
Mar 25 MySQL
mysql5.5中文乱码问题解决的有用方法
May 30 MySQL
MySQL安装失败的原因及解决步骤
Jun 14 MySQL
mysql sql常用语句大全
Jun 21 MySQL
MySQL中正则表达式(REGEXP)使用详解
Jul 07 MySQL
详解MySQL的内连接和外连接
May 08 MySQL
SQL实现LeetCode(177.第N高薪水)
Aug 04 #MySQL
MySQL千万级数据表的优化实战记录
Aug 04 #MySQL
SQL实现LeetCode(176.第二高薪水)
Aug 04 #MySQL
Mysql8.0递归查询的简单用法示例
Aug 04 #MySQL
SQL之各种join小结详细讲解
SQL实现LeetCode(175.联合两表)
Aug 04 #MySQL
一篇文章带你深入了解Mysql触发器
Aug 02 #MySQL
You might like
基于laravel belongsTo使用详解
2019/10/18 PHP
用javascript实现画板的代码
2007/09/05 Javascript
javascript 避免闭包引发的问题
2009/03/17 Javascript
jquery.alert 弹出式复选框实现代码
2009/06/15 Javascript
页面按钮禁用与解除禁用的方法
2014/02/19 Javascript
简单的js图片轮换代码(js图片轮播)
2014/05/06 Javascript
JavaScript中的各种操作符使用总结
2016/05/26 Javascript
JS实现的简单轮播图运动效果示例
2016/12/22 Javascript
温故知新——JavaScript中的字符串连接问题最全总结(推荐)
2017/08/21 Javascript
小程序兼容安卓和IOS数据处理问题及坑
2018/09/18 Javascript
JS实现数组去重及数组内对象去重功能示例
2019/02/02 Javascript
layui之table checkbox初始化时选中对应选项的方法
2019/09/02 Javascript
vue 获取到数据但却渲染不到页面上的解决方法
2020/11/19 Vue.js
[36:52]DOTA2真视界:基辅特锦赛总决赛
2017/05/21 DOTA
Python实现上下班抢个顺风单脚本
2018/02/07 Python
Python实现正则表达式匹配任意的邮箱方法
2018/12/20 Python
11个Python3字典内置方法大全与示例汇总
2019/05/13 Python
python SQLAlchemy的Mapping与Declarative详解
2019/07/04 Python
10分钟教你用python动画演示深度优先算法搜寻逃出迷宫的路径
2019/08/12 Python
tensorflow 模型权重导出实例
2020/01/24 Python
Python利用逻辑回归分类实现模板
2020/02/15 Python
python3中sys.argv的实例用法
2020/04/24 Python
python爬虫实例之获取动漫截图
2020/05/31 Python
HTML5之SVG 2D入门2—图形绘制(基本形状)介绍及使用
2013/01/30 HTML / CSS
Urban Outfitters德国官网:美国跨国生活方式零售公司
2018/05/21 全球购物
构造方法和其他方法的区别?怎么调用父类的构造方法
2013/09/22 面试题
英语自我评价范文
2014/01/24 职场文书
函授药学自我鉴定
2014/02/07 职场文书
购房意向书
2014/04/01 职场文书
医院合作协议书
2014/08/19 职场文书
授权委托书
2014/09/17 职场文书
党员群众路线整改措施及今后努力方向
2014/10/28 职场文书
2014年乡镇党建工作总结
2014/11/11 职场文书
检讨书范文
2019/04/16 职场文书
Python离线安装openpyxl模块的步骤
2021/03/30 Python
MySQL into_Mysql中replace与replace into用法案例详解
2021/09/14 MySQL