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
Navicat for MySQL的使用教程详解
May 27 MySQL
解决Navicat for Mysql连接报错1251的问题(连接失败)
May 27 MySQL
MySQL query_cache_type 参数与使用详解
Jul 01 MySQL
MySQL实例精讲单行函数以及字符数学日期流程控制
Oct 15 MySQL
为什么MySQL 删除表数据 磁盘空间还一直被占用
Oct 16 MySQL
Linux7.6二进制安装Mysql8.0.27详细操作步骤
Nov 27 MySQL
MySQL视图概念以及相关应用
Apr 19 MySQL
mysql拆分字符串作为查询条件的示例代码
Jul 07 MySQL
MySQL控制流函数(-if ,elseif,else,case...when)
Jul 07 MySQL
mysql查看表结构的三种方法总结
Jul 07 MySQL
MySQL提升大量数据查询效率的优化神器
Jul 07 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操作文件方法问答
2007/03/16 PHP
php实现将数组转换为XML的方法
2015/03/09 PHP
Symfony实现行为和模板中取得request参数的方法
2016/03/17 PHP
浅谈ThinkPHP5.0版本和ThinkPHP3.2版本的区别
2017/06/17 PHP
ThinkPHP5.1框架页面跳转及修改跳转页面模版示例
2019/05/06 PHP
jquery 选择器部分整理
2009/10/28 Javascript
jquery实现简单的拖拽效果实例兼容所有主流浏览器
2013/06/21 Javascript
javascript异步编程的4种方法
2014/02/19 Javascript
jQuery获得document和window对象宽度和高度的方法
2015/03/25 Javascript
JavaScript encodeURI 和encodeURIComponent
2015/12/04 Javascript
基于JavaScript如何制作遮罩层对话框
2016/01/26 Javascript
IE8 内存泄露(内存一直增长 )的原因及解决办法
2016/04/06 Javascript
jquery插件Jplayer使用方法简析
2016/04/22 Javascript
VUE实现日历组件功能
2017/03/13 Javascript
详解Angular2 之 结构型指令
2017/06/21 Javascript
关于vue中 $emit的用法详解
2018/04/12 Javascript
微信小程序实现提交input信息到后台的方法示例
2019/01/19 Javascript
js实现拖拽与碰撞检测
2020/09/18 Javascript
[10:18]2018DOTA2国际邀请赛寻真——Fnatic能否笑到最后?
2018/08/14 DOTA
Python利用matplotlib.pyplot绘图时如何设置坐标轴刻度
2018/04/09 Python
简单了解python中的f.b.u.r函数
2019/11/02 Python
Pytorch GPU显存充足却显示out of memory的解决方式
2020/01/13 Python
详解Python 循环嵌套
2020/07/09 Python
HTML最新标准HTML5总结(必看)
2016/06/13 HTML / CSS
HTML5 body设置自适应全屏
2020/05/07 HTML / CSS
技术经理的自我评价范文
2013/12/03 职场文书
县长群众路线对照检查材料思想汇报
2014/10/02 职场文书
行政经理岗位职责
2015/04/15 职场文书
基层党支部承诺书
2015/04/30 职场文书
2015年小学图书室工作总结
2015/05/18 职场文书
家长会开场白和结束语
2015/05/29 职场文书
2015军训通讯稿大全
2015/07/18 职场文书
2016年寒假学习心得体会
2015/10/09 职场文书
品牌形象定位,全面分析
2019/07/23 职场文书
vue.js Router中嵌套路由的实用示例
2021/06/27 Vue.js
Python中的变量与常量
2021/11/11 Python