SQL实现LeetCode(178.分数排行)

 更新时间:2021年08月03日 15:32:34   作者:Grandyang  
这篇文章主要介绍了SQL实现LeetCode(178.分数排行),本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下

[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查询语句优化技巧

    这篇文章主要介绍了Mysql查询语句优化技巧的相关资料,需要的朋友可以参考下
    2016-04-04
  • mysql alter table 修改表命令详细介绍

    mysql alter table 修改表命令详细介绍

    MYSQL ALTER TABLE命令用于修改表结构,例如添加/修改/删除字段、索引、主键等等,本文章通过实例向大家介绍MYSQL ALTER TABLE语句的使用方法,需要的朋友可以参考一下。
    2016-10-10
  • MySQL Antelope和Barracuda的区别分析

    MySQL Antelope和Barracuda的区别分析

    这篇文章主要介绍了MySQL Antelope和Barracuda的区别分析,Antelope和Barracude都是一种文件格式,需要的朋友可以参考下
    2014-07-07
  • Linux(CentOS7)安装MySQL8全过程

    Linux(CentOS7)安装MySQL8全过程

    这篇文章主要介绍了Linux(CentOS7)安装MySQL8全过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-06-06
  • mysql之DML的select分组排序方式

    mysql之DML的select分组排序方式

    在此教程中,我们详细介绍如何创建员工(employee)和部门(department)数据库表,并展示了如何通过SQL语句进行数据插入、删除和查询,首先,创建了部门表并自动设置部门编号起始值为1001,接着创建员工表并定义了各字段,我们还设置了外键关联两表
    2024-09-09
  • Windows server 2008 r2下MySQL5.7.17 winx64安装版配置方法图文教程

    Windows server 2008 r2下MySQL5.7.17 winx64安装版配置方法图文教程

    这篇文章主要为大家详细介绍了Windows server 2008 r2下MySQL5.7.17 winx64安装版配置方法图文教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-03-03
  • Linux下MySQL5.7.18 yum方式从卸载到安装过程图解

    Linux下MySQL5.7.18 yum方式从卸载到安装过程图解

    这篇文章主要介绍了Linux下MySQL5.7.18 yum方式从卸载到安装过程图解,需要的朋友可以参考下
    2017-06-06
  • MySQL分区表实现按月份归类

    MySQL分区表实现按月份归类

    mysql 单表数据量达到千万、亿级,可以通过分表与表分区提升服务性能。本文主要介绍了MySQL分区表实现按月份归类,感兴趣的可以了解一下
    2021-10-10
  • mysql中的int(5)到底有是多长

    mysql中的int(5)到底有是多长

    这篇文章主要介绍了mysql中的int(5)到底有是多长,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-04-04
  • MYSQL使用inner join 进行 查询/删除/修改示例

    MYSQL使用inner join 进行 查询/删除/修改示例

    本文为大家介绍下使用inner join 进行查询/删除/修改,具体实现如下,学习mysql的朋也可以学习下,希望对大家有所帮助
    2013-07-07

最新评论