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性能压力基准测试工具sysbench的使用简介
Apr 21 MySQL
Mysql 用户权限管理实现
May 25 MySQL
Mysql数据库命令大全
May 26 MySQL
浅析MySQL如何实现事务隔离
Jun 26 MySQL
SQL实现LeetCode(197.上升温度)
Aug 07 MySQL
浅谈redis的过期时间设置和过期删除机制
Mar 18 MySQL
Mysql排查分析慢sql之explain实战案例
Apr 19 MySQL
提高系统的吞吐量解决数据库重复写入问题
Apr 23 MySQL
MySQL的prepare使用以及遇到的bug
May 11 MySQL
MySQL 原理优化之Group By的优化技巧
Aug 14 MySQL
MySQL新手入门进阶语句汇总
Sep 23 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中call_user_func_array的作用
2013/06/07 PHP
laravel中数据显示方法(默认值和下拉option默认选中)
2019/10/11 PHP
Javascript打印网页部分内容的脚本
2008/11/17 Javascript
JQuery Tab选项卡效果代码改进版
2010/04/01 Javascript
学习并汇集javascript匿名函数
2010/11/25 Javascript
js通过八个点 拖动改变div大小的实现方法
2014/03/05 Javascript
js实现有时间限制消失的图片方法
2015/02/27 Javascript
AngularJS模块管理问题的非常规处理方法
2015/04/29 Javascript
JQuery中DOM事件冒泡实例分析
2015/06/13 Javascript
基于Bootstrap重置输入框内容按钮插件
2016/05/12 Javascript
Jquery揭秘系列:ajax原生js实现详解(推荐)
2016/06/08 Javascript
JavaScript必知必会(五) eval 的使用
2016/06/08 Javascript
JS写XSS cookie stealer来窃取密码的步骤详解
2017/11/20 Javascript
Vue2.5 结合 Element UI 之 Table 和 Pagination 组件实现分页功能
2018/01/26 Javascript
vue实现跨域的方法分析
2019/05/21 Javascript
配置node服务器并且链接微信公众号接口配置步骤详解
2019/06/21 Javascript
vue控制多行文字展开收起的实现示例
2019/10/11 Javascript
JavaScript this指向相关原理及实例解析
2020/07/10 Javascript
解决vue props传Array/Object类型值,子组件报错的情况
2020/11/07 Javascript
[05:09]第二届DOTA2亚洲邀请赛决赛日比赛集锦:iG 3:0 OG夺冠
2017/04/05 DOTA
Python正则表达式教程之一:基础篇
2017/03/02 Python
Python爬虫小技巧之伪造随机的User-Agent
2018/09/13 Python
对Python2与Python3中__bool__方法的差异详解
2018/11/01 Python
scrapy中如何设置应用cookies的方法(3种)
2020/09/22 Python
两种CSS3伪类选择器详细介绍
2013/12/24 HTML / CSS
加拿大女包品牌:Matt & Nat
2017/05/12 全球购物
Rhone官方网站:男士运动服装、健身服装和高级运动服
2019/05/01 全球购物
下面代码从性能上考虑,有什么问题
2015/04/03 面试题
若干个Java基础面试题
2015/05/19 面试题
运动会入场词200字
2014/02/15 职场文书
大学生个人求职口试自我评价
2014/02/16 职场文书
酒店管理专业毕业生求职自荐信
2014/04/28 职场文书
管理标语大全
2014/06/24 职场文书
工程承包协议书范本
2014/09/29 职场文书
干部培训工作总结2015
2015/05/25 职场文书
Java中的继承、多态以及封装
2022/04/11 Java/Android