178分数排名

表: Scores

+-------------+---------+
| Column Name | Type    |
+-------------+---------+
| id          | int     |
| score       | decimal |
+-------------+---------+
Id是该表的主键。
该表的每一行都包含了一场比赛的分数。Score是一个有两位小数点的浮点值。

编写 SQL 查询对分数进行排序。排名按以下规则计算:

分数应按从高到低排列。
如果两个分数相等,那么两个分数的排名应该相同。
在排名相同的分数后,排名数应该是下一个连续的整数。换句话说,排名之间不应该有空缺的数字。
按 score 降序返回结果表。

查询结果格式如下所示。

示例 1:

输入:
Scores 表:
+----+-------+
| id | score |
+----+-------+
| 1  | 3.50  |
| 2  | 3.65  |
| 3  | 4.00  |
| 4  | 3.85  |
| 5  | 4.00  |
| 6  | 3.65  |
+----+-------+
输出:
+-------+------+
| score | rank |
+-------+------+
| 4.00  | 1    |
| 4.00  | 1    |
| 3.85  | 2    |
| 3.65  | 3    |
| 3.65  | 3    |
| 3.50  | 4    |
+-------+------+

解题思路

解法一:

使用mysql自带的排序函数,简单好用,效率高:

  1. rank() over
    作用:查出指定条件后的进行排名,条件相同排名相同,排名间断不连续。
    说明:例如学生排名,使用这个函数,成绩相同的两名是并列,下一位同学空出所占的名次。即:1 1 3 4 5 5 7

  2. dense_rank() over
    作用:查出指定条件后的进行排名,条件相同排名相同,排名间断不连续。
    说明:和rank() over 的作用相同,区别在于dense_rank() over 排名是密集连续的。例如学生排名,使用这个函数,成绩相同的两名是并列,下一位同学接着下一个名次。即:1 1 2 3 4 5 5 6

  3. row_number() over
    作用:查出指定条件后的进行排名,条件相同排名也不相同,排名间断不连续。
    说明:这个函数不需要考虑是否并列,即使根据条件查询出来的数值相同也会进行连续排序。即:1 2 3 4 5 6

使用小提示
dense_rank() over 后面跟排序的依据的列,下面是用了一个排序好的列(order by score desc)。
注意:如果select中有一列是用rank()这类函数,其他的列都会按着他这列规定好的顺序排。

select score, dense_rank() over (order by score desc) as 'rank' from Scores;

解法二:

如果面试官或者题目要求不让使用函数,让你使用算法,你使用解法二,虽然效率不高,但是能解决问题。
这种方法也好理解,比如你考了98分,,你同学a也考了98分,找到大于等于你的成绩,一个99分,一个98分,一个98分,去重复,就一个99,一个98,count一下总数,第二名,即使如果还有3个97分的,但是他们都死在了筛选条件,所以还是第二。
实现代码如下,好好理解一下:

select a.Score as Score,
(select count(distinct b.Score) from Scores b where a.Score <= b.Score) as 'Rank'
from Scores a
order by a.Score desc

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/rank-scores
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

LeetCode力扣刷题数据库(178):分数排名相关推荐

  1. IDEA LeetCode力扣刷题插件 中文类名 模板

    在用idea力扣插件刷题时,用中文作为类名会出现空格或者其他符号,总所周知,变量名和类名是不能出现空格和其他符号的,在我查阅了官方文档后,发现模板的工具类是继承了Stringutils的,所以在代码模 ...

  2. leetcode(力扣)刷题题解网站

    中文题解直接看力扣的题解 如果想要看国外大神的相关题解,只需要将中文题解网址中的'-cn' 去掉即可 英文题解网址: https://leetcode.com/problems/binary-tree ...

  3. LeetCode力扣刷题——居合斩!二分查找

    二分查找 一.算法解释         二分查找也常被称为二分法或者折半查找,每次查找时通过将待查找区间分成两部分并只取 一部分继续查找,将查找的复杂度大大减少.对于一个长度为 O ( n ) 的数组 ...

  4. LeetCode力扣刷题——千奇百怪的排序算法

    排序算法 一.常见的排序算法         以下是一些最基本的排序算法.虽然在 C++ 里可以通过 std::sort() 快速排序,而且刷题时很少需要自己手写排序算法,但是熟习各种排序算法可以加深 ...

  5. LeetCode力扣刷题——巧解数学问题

    数论 一.引言         对于 LeetCode 上数量不少的数学题,我们尽量将其按照类型划分讲解.然而很多数学题的解法并不通用,我们也很难在几道题里把所有的套路讲清楚,因此我们只选择了几道经典 ...

  6. leetcode力扣刷题系列python——2、两数相加

    题目: 给出两个 非空 的链表用来表示两个非负的整数.其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字. 如果,我们将这两个数相加起来,则会返回一个新的链表来表示 ...

  7. Leetcode力扣刷题

    704. 二分查找 给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1. clas ...

  8. LeetCode力扣刷题——简单易懂的贪心算法

    贪心 一.算法解释 采用贪心的策略,保证每次操作都是局部最优的,从而使最后得到的结果是全局最优的. 贪心算法问题需要满足的条件: (1)最优子结构:规模较大的问题的解由规模较小的子问题的解组成,规模较 ...

  9. leetcode数据库题库-178. 分数排名

    leetcode数据库题库-178. 分数排名https://leetcode-cn.com/problems/rank-scores/题目核心是[重复且连续]的排序 ,排序相关函数简单整理下 一.R ...

最新文章

  1. 基于尺寸划分的RGB显著物体检测方法
  2. 零知识证明实践教程,第一部分
  3. phpmyadmin error:#2002 - 服务器没有响应
  4. 转 Log4j.properties配置详解
  5. linux iscsi
  6. 将COM+ Events进行到底[转]
  7. MapReduce经典案例——统计单词数
  8. 垃圾收集中的代际差异
  9. Magento调用静态块 static block
  10. 《目标检测》YOLO、SSD简单学习
  11. 修改Android中的文件权限
  12. 〖Demo〗-- 多级评论
  13. 毕业10年,阻碍你职业发展的最大“拦路虎”到底是什么?
  14. DataLogic 工业串口扫码器Python读取说明
  15. linux 消息队列查看和删除
  16. comboxedit不可输入_javafx combobox在edit状态下无法选择
  17. excel表格横向纵向变换_Excel新手最容易给自己挖的几个坑,手把手教你完美避雷!...
  18. cascading--wordcount
  19. loj534. 「LibreOJ Round #6」花团
  20. 教资(信息技术学科知识与教学能力)13-1信息技术课程知识

热门文章

  1. 计算机锁定不能强制选项无法关机,win7系统总需要强制关机怎么解决 win7电脑无法正常关机的解决方法...
  2. 电脑是怎么通过IP找到终端的
  3. 【Linux】常用文件管理指令
  4. 极客之眼 Nmap:窥探世界的第一步
  5. 3dsmax2009-2019哪个版本更好?
  6. mac 搭建文件服务器,MacOS-搭建本地服务器
  7. Goland最新服务器激活
  8. 保姆级教程【车道线检测】,跟着一步一步来,小学生都可以学会吧
  9. python面向对象图片_趣味解读Python面向对象编程 (类和对象)
  10. 编写MQTTClient测试程序,和PC端运行的MQTT服务程序进行数据收发