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 数据类型选择原则
May 27 MySQL
MySQL注入基础练习
May 30 MySQL
Unity连接MySQL并读取表格数据的实现代码
Jun 20 MySQL
解决Mysql的left join无效及使用的注意事项说明
Jul 01 MySQL
MySQL数据库超时设置配置的方法实例
Oct 15 MySQL
mysql分表之后如何平滑上线详解
Nov 01 MySQL
MYSQL 表的全面总结
Nov 11 MySQL
MySQL学习之基础命令实操总结
Mar 19 MySQL
实战 快速定位MySQL的慢SQL
Mar 22 MySQL
MySQL数据库查询进阶之多表查询详解
Apr 08 MySQL
MySQL创建管理KEY分区
Apr 13 MySQL
解决Mysql中的innoDB幻读问题
Apr 29 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
火车采集器 免费版使出收费版本功能实现原理
2009/09/17 PHP
PHP 如何获取二维数组中某个key的集合
2014/06/03 PHP
锋利的jQuery 要点归纳(二) jQuery中的DOM操作(下)
2010/03/23 Javascript
Js实现当前点击a标签变色突出显示其他a标签回复原色
2013/11/27 Javascript
jquery库文件略庞大用纯js替换jquery的方法
2014/08/12 Javascript
Node.js中Request模块处理HTTP协议请求的基本使用教程
2016/03/31 Javascript
js获取html的span标签的值方法(超简单)
2016/07/26 Javascript
详解Js模板引擎(TrimPath)
2016/11/22 Javascript
MvcPager分页控件 适用于Bootstrap
2017/06/03 Javascript
js实现鼠标移动到图片产生遮罩效果
2017/10/21 Javascript
React Native 使用Fetch发送网络请求的示例代码
2017/12/02 Javascript
通过webpack引入第三方库的方法
2018/07/20 Javascript
微信小程序自定义select下拉选项框组件的实现代码
2018/08/28 Javascript
详解关于Angular4 ng-zorro使用过程中遇到的问题
2018/12/05 Javascript
vue实现的网易云音乐在线播放和下载功能案例
2019/02/18 Javascript
详解Vue3 Teleport 的实践及原理
2020/12/02 Vue.js
[03:00]《DAC最前线》之欧美新秀VS老将
2015/02/01 DOTA
详解Python3中的Sequence type的使用
2015/08/01 Python
PyQt5内嵌浏览器注入JavaScript脚本实现自动化操作的代码实例
2019/02/13 Python
树莓派极简安装OpenCv的方法步骤
2019/10/10 Python
Python如何实现动态数组
2019/11/02 Python
OpenCV里的imshow()和Matplotlib.pyplot的imshow()的实现
2019/11/25 Python
python中time、datetime模块的使用
2020/12/14 Python
python 检测nginx服务邮件报警的脚本
2020/12/31 Python
阿迪达斯比利时官方商城:adidas比利时
2016/10/10 全球购物
美国真皮手袋品牌:GiGi New York
2017/03/10 全球购物
匡威德国官网:Converse德国
2019/01/26 全球购物
创业计划书怎样才能打动风投
2014/01/01 职场文书
教师教学评估方案
2014/05/09 职场文书
2014年体育工作总结
2014/11/24 职场文书
2015年电工工作总结
2015/04/10 职场文书
会议通知
2015/04/15 职场文书
2016年领导干部正风肃纪心得体会
2015/10/09 职场文书
社区服务理念口号
2015/12/25 职场文书
Python学习之时间包使用教程详解
2022/03/21 Python
利用Python将list列表写入文件并读取的方法汇总
2022/03/25 Python