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
Mysql服务添加 iptables防火墙策略的方案
Apr 29 MySQL
将图片保存到mysql数据库并展示在前端页面的实现代码
May 02 MySQL
详细谈谈MYSQL中的COLLATE是什么
Jun 11 MySQL
mysql联合索引的使用规则
Jun 23 MySQL
MySQL分库分表详情
Sep 25 MySQL
mysql如何能有效防止删库跑路
Oct 05 MySQL
mysql事务对效率的影响分析总结
Oct 24 MySQL
JMeter对MySQL数据库进行压力测试的实现步骤
Jan 22 MySQL
一文搞清楚MySQL count(*)、count(1)、count(col)区别
Mar 03 MySQL
MySQL Server层四个日志的实现
Mar 31 MySQL
MySQL中的 inner join 和 left join的区别解析(小结果集驱动大结果集)
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安装攻略:常见问题解答(三)
2006/10/09 PHP
在PHP中养成7个面向对象的好习惯
2010/01/28 PHP
php中的静态变量的基本用法
2014/03/20 PHP
使用laravel的Eloquent模型如何获取数据库的指定列
2019/10/17 PHP
二行代码解决全部网页木马
2008/03/28 Javascript
THREE.JS入门教程(5)你应当知道的十件事
2013/01/24 Javascript
原生js实现shift/ctrl/alt按键的获取
2013/04/08 Javascript
鼠标悬浮停留三秒后自动显示大图js代码
2014/09/09 Javascript
jQuery事件处理的特征(事件命名机制)
2016/08/23 Javascript
jQuery设计思想
2017/03/07 Javascript
微信小程序 sha1 实现密码加密实例详解
2017/07/06 Javascript
原生js实现仿window10系统日历效果的实例
2017/10/31 Javascript
vue项目国际化vue-i18n的安装使用教程
2018/03/14 Javascript
vue通过cookie获取用户登录信息的思路详解
2018/10/30 Javascript
layer扩展打开/关闭动画的方法
2019/09/23 Javascript
nodejs实现UDP组播示例方法
2019/11/04 NodeJs
[01:17]辉夜杯战队访谈宣传片—EHOME
2015/12/25 DOTA
[01:02:09]Liquid vs TNC 2019国际邀请赛淘汰赛 胜者组 BO3 第二场 8.21
2020/07/19 DOTA
Python在Windows和在Linux下调用动态链接库的教程
2015/08/18 Python
关于Python3 lambda函数的深入浅出
2019/11/27 Python
python numpy数组中的复制知识解析
2020/02/03 Python
Python中import导入不同目录的模块方法详解
2020/02/18 Python
CSS3中文字镂空、透明值、阴影效果设置示例小结
2016/03/07 HTML / CSS
HTML5 Web 存储详解
2016/09/16 HTML / CSS
突袭HTML5之Javascript API扩展4—拖拽(Drag/Drop)概述
2013/01/31 HTML / CSS
新奥尔良珠宝:Mignon Faget
2020/11/23 全球购物
MAC彩妆澳洲官网:M·A·C AU
2021/01/17 全球购物
extern在函数声明中是什么意思
2014/01/19 面试题
物业管理专业个人的自我评价
2013/11/19 职场文书
大学生职业生涯设计书
2014/01/02 职场文书
竞职演讲稿范文
2014/01/11 职场文书
银行委托书范本
2014/09/28 职场文书
实习单位证明范例
2014/11/17 职场文书
中班上学期个人总结
2015/02/12 职场文书
简历中自我评价范文
2015/03/11 职场文书
python基础入门之字典和集合
2021/06/13 Python