leetcode mysql 排名_Leetcode178.分数排名(中等)

题目

编写一个 SQL 查询来实现分数排名。

如果两个分数相同,则两个分数排名(Rank)相同。请注意,平分后的下一个名次应该是下一个连续的整数值。换句话说,名次之间不应该有“间隔”。

+----+-------+

| Id | Score |

+----+-------+

| 1 | 3.50 |

| 2 | 3.65 |

| 3 | 4.00 |

| 4 | 3.85 |

| 5 | 4.00 |

| 6 | 3.65 |

+----+-------+

例如,根据上述给定的 Scores 表,你的查询应该返回(按分数从高到低排列):

+-------+------+

| Score | Rank |

+-------+------+

| 4.00 | 1 |

| 4.00 | 1 |

| 3.85 | 2 |

| 3.65 | 3 |

| 3.65 | 3 |

| 3.50 | 4 |

+-------+------+

重要提示:对于 MySQL 解决方案,如果要转义用作列名的保留字,可以在关键字之前和之后使用撇号。例如 Rank

审题

这个题目其实就是对得分Score进行排序,且同薪同名且总排名连续,同样的薪水排名结果为1-2-2-3。

得到的结果为Score Rank两列,且按Score进行降序。

自己的解答

其实在做之前的时候已经得到过分数排名的,只不过是对分数进行了去重。在此基础上和Scores表进行内连接然后按Score排序就可以得到最终的结果,但是这样的想法比较简单,但是感觉效率不高。

自己生成表与数据

CREATE TABLE Scores(

Id INT,

Score FLOAT);

INSERT INTO Scores(Id, Score) VALUE(1, 3.5),(2,3.65),(3,4.0),(4,3.85),(5,4.0),(6,3.65);

SELECT * FROM Scores;

回顾一下之前是怎么得到排名的

1.两表自连接,连接条件设定为表1的score小于等于表2的score

2.以表1的score分组,统计表1中每个salary分组后对应表2中score唯一值个数

SELECT S1.`Score`, COUNT(DISTINCT S2.`Score`) as `Rank`

FROM Scores AS S1

JOIN Scores AS S2

ON S1.`Score` <= S2.`Score`

GROUP BY S1.Score;

a952dcb0dd28

下面构造内连接即可

SELECT tmp.*

FROM Scores

JOIN (SELECT S1.`Score`, COUNT(DISTINCT S2.`Score`) as `Rank`

FROM Scores AS S1

JOIN Scores AS S2

ON S1.`Score` <= S2.`Score`

GROUP BY S1.Score) as `tmp`

ON Scores.`Score` = tmp.Score

ORDER BY tmp.Score DESC;

提交成功

a952dcb0dd28

好像还不算太慢

注意点

由于Rank为关键字,所以必须 用` `

而且定义变量的方法也是可行的(177提到过)

SELECT @r:=IF(@p=score, @r, @r+1) AS `rank`, @p:= score AS Score

FROM Scores, (SELECT @r:=0, @p:=NULL)init

ORDER BY score DESC;

a952dcb0dd28

子查询调换一下列即可

# Write your MySQL query statement below

SELECT tmp.Score, tmp.`rank`

FROM (SELECT @r:=IF(@p=score, @r, @r+1) AS `rank`, @p:= score AS Score

FROM Scores, (SELECT @r:=0, @p:=NULL)init

ORDER BY score DESC) AS tmp;

a952dcb0dd28

额。。。 我觉着没啥问题吧

要不就两列合并算了

SELECT S.`Score`, tmp.`rank`

FROM Scores AS S,

(SELECT @r:=IF(@p=score, @r, @r+1) AS `rank`, @p:= score AS Score

FROM Scores, (SELECT @r:=0, @p:=NULL)init

ORDER BY score DESC) AS tmp;

这样得到的笛卡尔乘积,跪了。。

别的思路与解答

1.子查询

分成两个部分写会容易很多

select a.Score as Score,

(select count(distinct b.Score) from Scores b where b.Score >= a.Score) as Rank

from Scores a

order by a.Score DESC

a952dcb0dd28

对以上数据应用窗口函数

1.涉及到排名问题,可以使用窗口函数

2.专用窗口函数rank, dense_rank, row_number有什么区别呢?

它们的区别我举个例子,你们一下就能看懂:

select *,

rank() over (order by 成绩 desc) as ranking,

dense_rank() over (order by 成绩 desc) as dese_rank,

row_number() over (order by 成绩 desc) as row_num

from 班级

结果如下

a952dcb0dd28

ranking 得到的排名是有间隔的

dese_rank 得到的排名是没有间隔的,也就是我们想要的结果

row_num 不管重复数据 就是给定行号

select score,

dense_rank() over(order by Score desc) as Rank

from Scores;

3.两表自连接

和我的方法类似 但不用再次联结了 也是1的外连接版本 1是3的子查询版本

按Id和Score分组。每组中,大于等于每个Score的不同Score数目就是其排名。

select S1.Score,count(distinct S2.Score) as `Rank`

from Scores as S1 join Scores as S2 on (S1.Score <= S2.Score)

group by S1.Id,S1.Score

order by S1.Score desc;

为什么要加 group by S1.Id?

因为要对表中每个数据进行排名 不然结果就是最小的一个

4.对1可以进行优化

把两表联结中的S2表改变一下,不要用所有的数据,而是去重之后再用

SELECT

S1.Score,

COUNT(DISTINCT S2.Score) AS `Rank`

FROM

Scores AS S1

JOIN

(SELECT DISTINCT

Score

FROM

Scores

ORDER BY Score DESC) AS S2

ON (S1.Score <= S2.Score)

GROUP BY S1.Id, S1.Score

ORDER BY S1.Score DESC ;

a952dcb0dd28

效率确实高一些吧。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/551160.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java post 中文乱码问题_java post中文乱码问题

java post中文乱码问题function addcategory() {if (document.myform.category.value "") {alert("商品分类不能为空");return;}//var categorydocument.getElementById("category").value;var c document.myform.category.value;alert(c);wit…

java struct工作原理_Struts2的工作原理(图解)详解

Struts2的工作原理上图来源于Struts2官方站点&#xff0c;是Struts 2 的整体结构。一个请求在Struts2框架中的处理大概分为以下几个步骤(可查看源码&#xff1a;https://github.com/apache/struts):1 客户端初始化一个指向Servlet容器(例如Tomcat)的请求2 这个请求经过一系列的…

java 旅行家的预算_洛谷 P1016 旅行家的预算 Java解法

洛谷 P1016 旅行家的预算 Java解法洛谷 P1016 旅行家的预算 Java解法package com.two;import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner sc new Scanner(System.in);double D1 sc.nextDouble();// 两个城市之间的距离double C …

java语言执行过程_Java程序的运行过程(执行流程)分析

万事知其然&#xff0c;要知其所以然&#xff0c;所以本节带大家来详细了解一下 Java 程序的执行过程。从《使用记事本编写运行Java程序》一节的案例可以看出&#xff0c;Java 程序的运行必须经过编写、编译和运行 3 个步骤。编写&#xff1a;是指在 Java 开发环境中进行程序代…

php搭建云服务器,云服务器上如何搭建php环境

1) 安装libtool和libtool-ltdl[rootlocalhost mysql]# yum -y install "libtool*"[rootlocalhost mysql]# yum -y install "libtool-ltdl*"2) 手工修改gd库文件PHP 5.4 也有一些 Bug&#xff0c;在检测 gd 库时会报错&#xff0c;需要我们手工修改。命令如…

php实现文本替换,php 如何实现文字替换

php实现文字替换的方法&#xff1a;首先创建一个PHP示例文件&#xff1b;然后输入代码“str_replace("iwind", "kiki", "i love iwind, iwind said");”&#xff1b;最后输出执行结果即可。在php替换字符效率最高也是最简单字符替换函数str_repl…

php 删除指定html标签,php删除html标签的三种解决办法

分享下PHP删除HTMl标签的三种方法。方法1&#xff1a;直接取出想要取出的标记function strip($str){$strstr_replace("","",$str);//$strhtmlspecialchars($str);return strip_tags($str);}//edit by www.jbxue.com?>方法2.PHP 中有个 strip_tags 函数…

达内php第三次月考,达内第三次月考

1. 下列不属于浏览器内置的对象的是&#xff1a;()A. navigatorB. documentC. windowD. request正确答案&#xff1a;D2. Servlet 可以存储数据的三个不同的作用域是()。A. 请求、会话和上下文B. 响应、会话和上下文C. 请求、响应和会话D. 请求、响应和上下文正确答案&#xff…

java win10 通知,如何使用Java AWT创建和显示Windows 10通知

在Java中, 如何生成不同类型的通知或警报非常令人困惑。一些开发人员更喜欢使用JOptionPane, 但是当你在固定环境中工作时(例如在Windows 10中), 使用Windows的默认通知样式非常好, 因此这就是为什么我们向你展示一个简短的摘要来显示Java AWT轻松实现Windows 10通知。以下代码…

matlab枚举类型,在 Simulink 模型中使用枚举数据

计算中的枚举值按照设计&#xff0c;Simulink 不允许在数学计算中将枚举值作为数值使用&#xff0c;即使枚举类是 MATLAB int32 类的子类也是如此。因此&#xff0c;尽管枚举类型存在基础整数&#xff0c;也不能作为数值类型使用。例如&#xff0c;您不能直接为 Gain 模块输入枚…

dataguard mysql,[dataguard同步数据库]Dataguard环境下数据库的备份与恢复

在线QQ客服&#xff1a;1922638专业的SQL Server、MySQL数据库同步软件在部署完active data guard后&#xff0c;不但可以将只读的查询交给备库执行&#xff0c;还可以把日常的数据库备份工作放在备库上执行&#xff0c;从而减轻主库的压力&#xff0c;充分的发挥服务器资源&am…

php getimagecompose,Docker进阶:Dockerfile以及docker-compose工具

Dockerfile&#xff1a;用来定制镜像的文件Docker-compose&#xff1a;用来部署容器集群的命令工具Dockerfile基本语法FROM&#xff1a;指定基础镜像&#xff0c;格式一般是FROM :FROM必须是Dockerfile的第一条非注释的命令是镜像名&#xff0c;是指定版本&#xff0c;不写的话…

Redis的安装以及使用

第一步&#xff0c;去官网下载一个压缩包到本地解压即用&#xff0c;绿色软件&#xff0c;不用其他操作&#xff0c;点击Download下载即可&#xff1a; Introduction to Redis | RedisLearn about the Redis open source projecthttps://redis.io/docs/about/第二步&#xff0…

oracle+行换列,Oracle的数据表中行转列与列转行的操作实例讲解

行转列一张表查询结果为--行转列select years,(select amount from Tb_Amount as A where month1 and A.yearsTb_Amount.years)as m1,(select amount from Tb_Amount as A where month2 and A.yearsTb_Amount.years)as m2,(select amount from Tb_Amount as A where month3 and…

js十秒没有点击怎么判断_MAC口红怎么判断真假?没批号就没有生产日期,网友:品控太差...

一般来说&#xff0c;MAC的口红产品&#xff0c;底部都会有三位编码&#xff0c;这是该款口红的批号。因像MAC这类国外美妆护肤品牌&#xff0c;是不会将生产日期明确的标注在产品上&#xff0c;都是将其编码成批号&#xff0c;在标注在外包装或者产品的侧面、底部等边缘位置。…

go run main.go 参数_介绍一款Go项目热编译工具gowatch

使用场景在golang项目编写过程中&#xff0c;需要对项目不断的进行构建go build并调试以快速发现问题&#xff0c;而我们每次进行手动的进行go build又太重复&#xff0c;所以写了这么一个工具gowatch来实时的监听文件的改动并编译运行&#xff0c;大大提升开发效率。快速入门安…

安卓rpg绅士游戏资源_海贼无双3(动作游戏)——电脑安卓单机游戏下载资源分享...

点击上方蓝字关注我们01游戏简介&#xff1a;游戏名称&#xff1a;海贼无双3其它名称&#xff1a;One Piece - Pirate Warriors 3游戏类型&#xff1a;动作游戏开发发行&#xff1a;Omega Force游戏平台&#xff1a;PC整理时间&#xff1a;2020-04-25官方网址&#xff1a;http:…

11210怎么等于24_想要消耗100大卡热量,怎么做才最简单?

减肥&#xff0c;最根本的原理就是制造热量差&#xff0c;从饮食上限制热量的摄入&#xff0c;调理体质让基础代谢更高&#xff0c;运动来进一步增加消耗&#xff0c;当热量差达到7000大卡左右的时候&#xff0c;就能瘦下来1kg的纯脂肪&#xff01;美食当前&#xff0c;自然要先…

连接linux工具Mtr,Linux常用网络工具:路由扫描之mtr

除了上一篇《Linux常用网络工具&#xff1a;路由扫描之traceroute》介绍的traceroute之外&#xff0c;一般Linux还内置了另一个常用的路由扫描工具mtr。mtr在某些方面比traceroute更好用&#xff0c;它可以实时显示经过的每一跳路由的信息&#xff0c;并不断进行探测。tracerou…

redis rua解决库存问题_【150期】面试官:Redis的各项功能解决了哪些问题?

点击上方“Java面试题精选”&#xff0c;关注公众号面试刷图&#xff0c;查缺补漏>>号外&#xff1a;往期面试题&#xff0c;10篇为一个单位归置到本公众号菜单栏->面试题&#xff0c;有需要的欢迎翻阅阶段汇总集合&#xff1a;一百期面试题汇总先看一下Redis是一个什…