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多表查询-笔记七
Apr 05 MySQL
mysql5.7使用binlog 恢复数据的方法
Jun 03 MySQL
MySQL的安装与配置详细教程
Jun 26 MySQL
MySQL系列之十 MySQL事务隔离实现并发控制
Jul 02 MySQL
mysql 索引合并的使用
Aug 30 MySQL
SQL实战演练之网上商城数据库商品类别数据操作
Oct 24 MySQL
面试被问select......for update会锁表还是锁行
Nov 11 MySQL
MYSQL 运算符总结
Nov 11 MySQL
MySQL的索引你了解吗
Mar 13 MySQL
pt-archiver 主键自增
Apr 26 MySQL
MySQL范围查询优化的场景实例详解
Jun 10 MySQL
SQL语句中EXISTS的详细用法大全
Jun 25 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实现文件下载功能的几个代码分享
2014/05/10 PHP
php密码生成类实例
2014/09/24 PHP
PHP实现动态添加XML中数据的方法
2018/03/30 PHP
几个有趣的Javascript Hack
2010/07/24 Javascript
jquery插件如何使用 jQuery操作Cookie插件使用介绍
2012/12/15 Javascript
jquery动态增加text元素以及删除文本内容实例代码
2013/07/01 Javascript
node.js中的http.createClient方法使用说明
2014/12/15 Javascript
轻松学习jQuery插件EasyUI EasyUI创建RSS Feed阅读器
2015/11/30 Javascript
jQuery ready()和onload的加载耗时分析
2016/09/08 Javascript
快速解决js开发下拉框中blur与click冲突
2016/10/10 Javascript
javascript-解决mongoose数据查询的异步操作
2016/12/22 Javascript
JavaScript 字符串数字左补位,右补位,取固定长度,截位扩展函数代码
2017/03/25 Javascript
微信小程序 chooseImage选择图片或者拍照
2017/04/07 Javascript
Vue.js仿Metronic高级表格(二)数据渲染
2017/04/19 Javascript
浏览器事件循环与vue nextTicket的实现
2019/04/16 Javascript
vue elementui el-form rules动态验证的实例代码详解
2019/05/23 Javascript
Vue3 响应式侦听与计算的实现
2020/11/11 Javascript
原生js实现自定义滚动条组件
2021/01/20 Javascript
[03:08]迎霜节狂欢!2018年迎霜节珍藏Ⅰ一览
2018/12/25 DOTA
[15:20]DOTA2-DPC中国联赛 正赛 Elephant vs Aster 选手采访
2021/03/11 DOTA
Python操作json数据的一个简单例子
2014/04/17 Python
python使用str &amp; repr转换字符串
2016/10/13 Python
Python正则表达式实现简易计算器功能示例
2019/05/07 Python
将Python文件打包成.EXE可执行文件的方法
2019/08/11 Python
python数据处理——对pandas进行数据变频或插值实例
2020/04/22 Python
python给视频添加背景音乐并改变音量的具体方法
2020/07/19 Python
pycharm全局搜索的具体步骤
2020/07/28 Python
python中reload重载实例用法
2020/12/15 Python
Theory美国官网:后现代都市风时装品牌
2018/05/09 全球购物
中国双语服务优势的在线购票及活动平台:247tickets
2018/10/26 全球购物
Pedro官网:新加坡时尚品牌
2019/08/27 全球购物
英国最大的独立摄影零售商:Park Cameras
2019/11/27 全球购物
日语求职信范文
2013/12/17 职场文书
学生思想表现的评语
2014/01/30 职场文书
孝敬父母的演讲稿
2014/05/14 职场文书
领导班子民主生活会整改措施(工商局)
2014/09/21 职场文书