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 相关文章推荐
MySQL root密码的重置方法
Apr 21 MySQL
MySQL主从搭建(多主一从)的实现思路与步骤
May 13 MySQL
MySQL的Query Cache图文详解
Jul 01 MySQL
关于mysql中时间日期类型和字符串类型的选择
Nov 27 MySQL
详解MySql中InnoDB存储引擎中的各种锁
Feb 12 MySQL
一文搞懂MySQL索引页结构
Feb 28 MySQL
MySQL RC事务隔离的实现
Mar 31 MySQL
MYSQL优化之数据表碎片整理详解
Apr 03 MySQL
排查并解决MySQL生产库内存使用率高的报警
Apr 11 MySQL
深入理解MySQL中MVCC与BufferPool缓存机制
May 25 MySQL
MySQL安装失败的原因及解决步骤
Jun 14 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
The specified CGI application misbehaved by not returning a complete set of HTTP headers
2011/03/31 PHP
php批量删除超链接的实现方法
2015/10/19 PHP
php计算多个集合的笛卡尔积实例详解
2017/02/16 PHP
删除PHP数组中的重复元素的实现代码
2017/04/10 PHP
javascript插入样式实现代码
2012/02/22 Javascript
js优化针对IE6.0起作用(详细整理)
2012/12/25 Javascript
jquery写个checkbox——类似邮箱全选功能
2013/03/19 Javascript
jquery实现网页查找功能示例分享
2014/02/12 Javascript
jquery form 加载数据示例
2014/04/21 Javascript
Ext修改GridPanel数据和字体颜色、css属性等
2014/06/13 Javascript
JavaScript数值转换的三种方式总结
2014/07/31 Javascript
jQuery中:last选择器用法实例
2014/12/30 Javascript
js为什么不能正确处理小数运算?
2015/12/29 Javascript
JS验证逗号隔开可以是中文字母数字
2016/04/22 Javascript
jquery div模态窗口的简单实例
2016/05/28 Javascript
AngularJS监听路由变化的方法
2017/03/07 Javascript
Angular2实现自定义双向绑定属性
2017/03/22 Javascript
AngularJS中table表格基本操作示例
2017/10/10 Javascript
微信小程序实现图片上传放大预览删除代码
2020/06/28 Javascript
JS造成内存泄漏的几种情况实例分析
2020/03/02 Javascript
解决vue初始化项目一直停在downloading template的问题
2020/11/09 Javascript
Python中使用中文的方法
2011/02/19 Python
tensorflow学习笔记之mnist的卷积神经网络实例
2018/04/15 Python
python二进制文件的转译详解
2019/07/03 Python
python+opencv像素的加减和加权操作的实现
2019/07/14 Python
Python Django 添加首页尾页上一页下一页代码实例
2019/08/21 Python
Python实现壁纸下载与轮换
2020/10/19 Python
设计师珠宝:Ylang 23
2018/05/11 全球购物
李维斯法国官网:Levi’s法国
2019/07/13 全球购物
商务日语专业毕业生求职信
2013/10/26 职场文书
怎样写好自荐信和推荐信
2013/12/26 职场文书
法人授权委托书
2014/04/03 职场文书
酒店总经理岗位职责范本
2014/08/08 职场文书
采购员工作总结范文
2015/08/12 职场文书
pytorch MSELoss计算平均的实现方法
2021/05/12 Python
pytorch 运行一段时间后出现GPU OOM的问题
2021/06/02 Python