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的半同步
Apr 22 MySQL
详解MySQL连接挂死的原因
May 18 MySQL
MySQL完整性约束的定义与实例教程
May 30 MySQL
MySQL 常见的数据表设计误区汇总
Jun 07 MySQL
Mysql 如何查询时间段交集
Jun 08 MySQL
mysql获取指定时间段中所有日期或月份的语句(不设存储过程,不加表)
Jun 18 MySQL
VS2019连接MySQL数据库的过程及常见问题总结
Nov 27 MySQL
详解Mysql事务并发(脏读、不可重复读、幻读)
Apr 29 MySQL
MySql中的json_extract函数处理json字段详情
Jun 05 MySQL
MySQL详解进行JDBC编程与增删改查方法
Jun 16 MySQL
MySQL中正则表达式(REGEXP)使用详解
Jul 07 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
多人战的战术与战略
2020/03/04 星际争霸
用PHP编程开发“虚拟域名”系统
2006/10/09 PHP
帝国cms常用标签汇总
2015/07/06 PHP
smarty高级特性之对象的使用方法
2015/12/25 PHP
joomla实现注册用户添加新字段的方法
2016/05/05 PHP
Ubuntu 16.04中Laravel5.4升级到5.6的步骤
2018/12/07 PHP
Javascript 生成指定范围数值随机数
2009/01/09 Javascript
基于jquery打造的百分比动态色彩条插件
2012/09/19 Javascript
js获取多个tagname的节点数组
2013/09/22 Javascript
jquery取消选择select下拉框示例代码
2014/02/22 Javascript
使用delegate方法为一个tr标签加一个链接
2014/06/27 Javascript
js随机生成字母数字组合的字符串 随机动画数字
2015/09/02 Javascript
jQuery实现查找链接文字替换属性的方法
2016/06/27 Javascript
AngularJS ng-mousedown 指令
2016/08/02 Javascript
JavaScript中cookie工具函数封装的示例代码
2016/10/11 Javascript
vue.js中Vue-router 2.0基础实践教程
2017/05/08 Javascript
详解如何用babel转换es6的class语法
2018/04/03 Javascript
解决vue keep-alive 数据更新的问题
2018/09/21 Javascript
JS 封装父页面子页面交互接口的实例代码
2019/06/25 Javascript
JS实现随机抽选获奖者
2019/11/07 Javascript
python实现linux下使用xcopy的方法
2015/06/28 Python
bat和python批量重命名文件的实现代码
2016/05/19 Python
解决新版Pycharm中Matplotlib图像不在弹出独立的显示窗口问题
2019/01/15 Python
几个CSS3的flex弹性盒模型布局的简单例子演示
2016/05/12 HTML / CSS
九年级科学教学反思
2014/01/29 职场文书
全国优秀辅导员事迹材料
2014/05/14 职场文书
综艺节目策划方案
2014/06/13 职场文书
HR求职自荐信范文
2014/06/21 职场文书
学校党的群众路线教育实践活动制度建设计划
2014/11/03 职场文书
孕妇离婚协议书范本
2014/11/20 职场文书
公司放假通知范文
2015/04/14 职场文书
2015年保管员工作总结
2015/04/30 职场文书
交互式可视化js库gojs使用介绍及技巧
2022/02/18 Javascript
教你在 Java 中实现 Dijkstra 最短路算法的方法
2022/04/08 Java/Android
springboot创建的web项目整合Quartz框架的项目实践
2022/06/21 Java/Android
PostgreSQL之连接失败的问题及解决
2023/05/08 PostgreSQL