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 相关文章推荐
left join、inner join、right join的区别
Apr 05 MySQL
my.ini优化mysql数据库性能的十个参数(推荐)
May 26 MySQL
详解MySQL中的pid与socket
Jun 15 MySQL
mysql中int(3)和int(10)的数值范围是否相同
Oct 16 MySQL
SQL优化老出错,那是你没弄明白MySQL解释计划用法
Nov 27 MySQL
教你使用VS Code的MySQL扩展管理数据库的方法
Jan 22 MySQL
Pycharm远程调试和MySQL数据库授权问题
Mar 18 MySQL
MySQL中优化SQL语句的方法(show status、explain分析服务器状态信息)
Apr 09 MySQL
mysql字段为NULL索引是否会失效实例详解
May 30 MySQL
MySQL串行化隔离级别(间隙锁实现)
Jun 16 MySQL
MySQL详细讲解变量variables的用法
Jun 21 MySQL
MySQL中的 inner join 和 left join的区别解析(小结果集驱动大结果集)
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
MySQL授权问题总结
2007/05/06 PHP
PHP的博客ping服务代码
2012/02/04 PHP
php实现MySQL数据库备份与还原类实例
2014/12/09 PHP
php魔法函数与魔法常量使用介绍
2017/07/23 PHP
PHP操作XML中XPath的应用示例
2019/07/04 PHP
js实现简单的购物车有图有代码
2014/05/26 Javascript
JavaScript中使用arguments获得函数传参个数实例
2014/08/27 Javascript
node.js中的fs.realpathSync方法使用说明
2014/12/16 Javascript
JavaScript中的Math.E属性使用详解
2015/06/12 Javascript
JS与jQuery实现隔行变色的方法
2016/09/09 Javascript
Angular工具方法学习
2016/12/26 Javascript
Angular的MVC和作用域
2016/12/26 Javascript
详解AngularJS1.x学习directive 中‘&amp; ’‘=’ ‘@’符号的区别使用
2017/08/23 Javascript
vue2利用Bus.js如何实现非父子组件通信详解
2017/08/25 Javascript
js 公式编辑器 - 自定义匹配规则 - 带提示下拉框 - 动态获取光标像素坐标
2018/01/04 Javascript
动态加载JavaScript文件的3种方式
2018/05/05 Javascript
纯js封装的ajax功能函数与用法示例
2018/05/14 Javascript
Angularjs之ngModel中的值验证绑定方法
2018/09/13 Javascript
小程序实现抽奖动画
2020/04/16 Javascript
详解Vue2 添加对scss的支持
2019/01/02 Javascript
微信小程序实现的绘制table表格功能示例
2019/04/26 Javascript
javascript二维数组和对象的深拷贝与浅拷贝实例分析
2019/10/26 Javascript
JavaScript 俄罗斯方块游戏实现方法与代码解释
2020/04/08 Javascript
关于angular引入ng-zorro的问题浅析
2020/09/09 Javascript
Python的mysql数据库的更新如何实现
2017/07/31 Python
python3中os.path模块下常用的用法总结【推荐】
2018/09/16 Python
python Django 创建应用过程图示详解
2019/07/29 Python
Django REST框架创建一个简单的Api实例讲解
2019/11/05 Python
Python高级特性——详解多维数组切片(Slice)
2019/11/26 Python
解决python打开https出现certificate verify failed的问题
2020/09/03 Python
Python模拟登录requests.Session应用详解
2020/11/17 Python
英国百安居装饰建材网上超市:B&Q
2016/09/13 全球购物
英国最受欢迎的母婴精品品牌:JoJo Maman BéBé
2021/02/17 全球购物
教师师德演讲稿
2014/05/06 职场文书
男方婚前保证书
2015/02/28 职场文书
python 开心网和豆瓣日记爬取的小爬虫
2021/05/29 Python