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 相关文章推荐
数据库连接池
Apr 06 MySQL
MySQL 如何分析查询性能
May 12 MySQL
详解MySQL的Seconds_Behind_Master
May 18 MySQL
详解GaussDB for MySQL性能优化
May 18 MySQL
一看就懂的MySQL的聚簇索引及聚簇索引是如何长高的
May 25 MySQL
一文读懂navicat for mysql基础知识
May 31 MySQL
SQL注入的实现以及防范示例详解
Jun 02 MySQL
ORM模型框架操作mysql数据库的方法
Jul 25 MySQL
你真的会用Mysql的explain吗
Mar 31 MySQL
MySQL的表级锁,行级锁,排它锁和共享锁
Jul 15 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
php中一个完整表单处理实现代码
2011/11/10 PHP
Symfony的安装和配置方法
2016/03/17 PHP
php使用curl代理实现抓取数据的方法
2017/02/03 PHP
php中序列化与反序列化详解
2017/02/13 PHP
PHP使用递归按层级查找数据的方法
2019/11/10 PHP
jQuery对象和DOM对象的相互转化实现代码
2010/03/02 Javascript
JavaScript中常见陷阱小结
2010/04/27 Javascript
用C/C++来实现 Node.js 的模块(二)
2014/09/24 Javascript
JS实现获取键盘按下的按键并显示在页面上的方法
2015/11/04 Javascript
实例详解jQuery Mockjax 插件模拟 Ajax 请求
2016/01/12 Javascript
jQuery插件ajaxfileupload.js实现上传文件
2020/10/23 Javascript
jQuery中的100个技巧汇总
2016/12/15 Javascript
canvas 画布在主流浏览器中的尺寸限制详细介绍
2016/12/15 Javascript
bootstrap table动态加载数据示例代码
2017/03/25 Javascript
vue2.0实现导航菜单切换效果
2017/05/08 Javascript
JavaScript基本语法_动力节点Java学院整理
2017/06/26 Javascript
使用命令行工具npm新创建一个vue项目的方法
2017/12/27 Javascript
js实现一个简单的MVVM框架示例
2018/01/15 Javascript
详解基于Koa2开发微信二维码扫码支付相关流程
2018/05/16 Javascript
JavaScript实现表单注册、表单验证、运算符功能
2018/10/15 Javascript
了解JavaScript函数中的默认参数
2019/05/30 Javascript
判断“命令按钮”是否被鼠标单击详解
2019/07/31 Javascript
用Python编写一个简单的Lisp解释器的教程
2015/04/03 Python
Python实现批量读取word中表格信息的方法
2015/07/30 Python
Python编写打字训练小程序
2019/09/26 Python
Pytorch 的损失函数Loss function使用详解
2020/01/02 Python
pytorch 实现查看网络中的参数
2020/01/06 Python
python3中确保枚举值代码分析
2020/12/02 Python
python爬虫破解字体加密案例详解
2021/03/02 Python
学生会干部自荐信
2014/02/04 职场文书
日化店促销方案
2014/03/26 职场文书
群众路线表态发言材料
2014/10/17 职场文书
2015年世界环境日活动总结
2015/02/11 职场文书
2015安全保卫工作总结
2015/04/25 职场文书
学习委员竞选稿
2015/11/20 职场文书
Python pandas读取CSV文件的注意事项(适合新手)
2021/06/20 Python