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 相关文章推荐
Windows10下安装MySQL8
Apr 06 MySQL
解决Navicat for MySQL 连接 MySQL 报2005错误的问题
May 29 MySQL
MySQL单表千万级数据处理的思路分享
Jun 05 MySQL
如何搭建 MySQL 高可用高性能集群
Jun 21 MySQL
MySQL 服务和数据库管理
Nov 11 MySQL
MySQL为数据表建立索引的原则详解
Mar 03 MySQL
MySQL多表查询机制
Mar 17 MySQL
MySQL Server层四个日志的实现
Mar 31 MySQL
Windows下载并安装MySQL8.0.x 版本的完整教程
Apr 10 MySQL
MySQL三种方式实现递归查询
Apr 18 MySQL
MySQL数据库Innodb 引擎实现mvcc锁
May 06 MySQL
MySql如何将查询的出来的字段进行转换
Jun 14 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
2006/10/09 PHP
文件上传的实现
2006/10/09 PHP
PHP闭包(Closure)使用详解
2013/05/02 PHP
一个基于phpQuery的php通用采集类分享
2014/04/09 PHP
PHP将HTML转换成文本的实现代码
2015/01/21 PHP
mac os快速切换多个PHP版本的方法
2017/03/07 PHP
jQuery使用手册之二 DOM操作
2007/03/24 Javascript
asp.net 30分钟掌握无刷新 Repeater
2011/09/16 Javascript
JQuery为页面Dom元素绑定事件及解除绑定方法
2014/04/23 Javascript
jquery阻止后续事件只执行第一个事件
2014/07/24 Javascript
js中匿名函数的创建与调用方法分析
2014/12/19 Javascript
jquery插件qrcode在线生成二维码
2015/04/26 Javascript
基于Node.js的强大爬虫 能直接发布抓取的文章哦
2016/01/10 Javascript
JavaScript知识点总结(六)之JavaScript判断变量数据类型
2016/05/31 Javascript
node.js的事件机制
2017/02/08 Javascript
ES6新特性之数组、Math和扩展操作符用法示例
2017/04/01 Javascript
深入理解Javascript中的作用域链和闭包
2017/04/25 Javascript
js逆向解密之网络爬虫
2019/05/30 Javascript
vue treeselect获取当前选中项的label实例
2020/08/31 Javascript
[05:02][DOTA2]DOTA进化论 第一期
2013/09/27 DOTA
Python实现的RSS阅读器实例
2015/07/25 Python
使用python对文件中的数值进行累加的实例
2018/11/28 Python
安装docker-compose的两种最简方法
2019/07/30 Python
Python 执行矩阵与线性代数运算
2020/08/01 Python
HTML5 canvas基本绘图之绘制阴影效果
2016/06/27 HTML / CSS
美特斯邦威官方商城:邦购网
2016/10/13 全球购物
美国汽车轮胎和轮毂销售网站:Tire Rack
2018/01/11 全球购物
美国受信赖的教育产品供应商:Nest Learning
2018/06/14 全球购物
介绍一下你对SOA的认识
2016/04/24 面试题
物业客服专员岗位职责
2013/11/30 职场文书
《三顾茅庐》教学反思
2014/04/10 职场文书
学校教研活动总结
2014/07/02 职场文书
安全员岗位职责
2015/02/10 职场文书
迎新晚会主持词开场白
2015/05/28 职场文书
小学安全教育主题班会
2015/08/12 职场文书
高中班主任寄语
2019/06/21 职场文书