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 14 MySQL
详解MySQL 联合查询优化机制
May 10 MySQL
MySQL索引知识的一些小妙招总结
May 10 MySQL
mysql 带多个条件的查询方式
Jun 05 MySQL
MySql子查询IN的执行和优化的实现
Aug 02 MySQL
mysql使用FIND_IN_SET和group_concat两个方法查询上下级机构
Apr 20 MySQL
详细介绍MySQL中limit和offset的用法
May 06 MySQL
jdbc中自带MySQL 连接池实践示例
Jul 23 MySQL
数据设计之权限的实现
Aug 05 MySQL
Mysql中mvcc各场景理解应用
Aug 05 MySQL
MySQL 原理与优化之原数据锁的应用
Aug 14 MySQL
postgresql如何找到表中重复数据的行并删除
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
php操作mysql数据库的基本类代码
2014/02/25 PHP
php基础设计模式大全(注册树模式、工厂模式、单列模式)
2015/08/31 PHP
PHP智能识别收货地址信息实例
2019/01/05 PHP
Nigma vs Alliance BO5 第三场2.14
2021/03/10 DOTA
JavaScript插入动态样式实现代码
2012/02/22 Javascript
js 程序执行与顺序实现详解
2013/05/13 Javascript
js之onload事件的一点使用心得
2013/08/14 Javascript
JavaScript获取鼠标移动时的坐标(兼容IE8、chome谷歌、Firefox)
2014/09/13 Javascript
javascript实现选中复选框后相关输入框变灰不可用的方法
2015/08/11 Javascript
jQuery实现Flash效果上下翻动的中英文导航菜单代码
2015/09/22 Javascript
js中substr,substring,indexOf,lastIndexOf,split,replace的用法详解
2015/11/09 Javascript
原生和jQuery的ajax用法详解
2017/01/23 Javascript
AngularJS+Bootstrap3多级导航菜单的实现代码
2017/08/16 Javascript
webpack使用 babel-loader 转换 ES6代码示例
2017/08/21 Javascript
vue.js内置组件之keep-alive组件使用
2018/07/10 Javascript
Vue.js 图标选择组件实践详解
2018/12/03 Javascript
JS/HTML5游戏常用算法之碰撞检测 像素检测算法实例详解
2018/12/12 Javascript
基于 vue-skeleton-webpack-plugin 的骨架屏实战
2019/08/05 Javascript
解决ele ui 表格表头太长问题的实现
2019/11/13 Javascript
Jquery Fade用法详解
2020/11/06 jQuery
[01:21]DOTA2 新英雄 森海飞霞
2020/12/18 DOTA
Django 导出 Excel 代码的实例详解
2017/08/11 Python
浅谈Django学习migrate和makemigrations的差别
2018/01/18 Python
Python+matplotlib绘制不同大小和颜色散点图实例
2018/01/19 Python
python爬虫正则表达式之处理换行符
2018/06/08 Python
Python实现base64编码的图片保存到本地功能示例
2018/06/22 Python
Python imread、newaxis用法详解
2019/11/04 Python
Python GUI库PyQt5图形和特效样式QSS介绍
2020/02/25 Python
python Plotly绘图工具的简单使用
2020/03/03 Python
Python使用进程Process模块管理资源
2020/03/05 Python
Alba Moda德国网上商店:意大利时尚女装销售
2016/11/14 全球购物
新入职员工的自我介绍演讲稿
2014/01/02 职场文书
个人思想政治总结
2015/03/05 职场文书
销售经理助理岗位职责
2015/04/13 职场文书
鉴史问廉观后感
2015/06/10 职场文书
MySQL EXPLAIN输出列的详细解释
2021/05/12 MySQL