【MYSQL】分数排名

表: Scores

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

编写一个解决方案来查询分数的排名。排名按以下规则计算:

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

按 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

对于 SQL 用户,熟悉 窗口函数 在这里是有用的(对于大多数更高级的 SQL 问题也是如此):

窗口函数对一组查询行执行类似于聚合的操作。但是,聚合操作将查询行分组为一个单独的结果行,而窗口函数为每个查询行生成一个结果。

DENSE_RANK() 窗口函数恰好是我们在这个问题中需要的:

返回当前行在其分区中的排名,没有间隙。对等项被视为并列并获得相同的排名。此函数为对等组分配连续的排名;结果是大于一的组不产生不连续的排名号码。

看起来我们可以在这个问题中很好地使用 DENSE_RANK() 窗口函数。

SELECTS.score,DENSE_RANK() OVER (ORDER BYS.score DESC) AS 'rank'
FROMScores S;

注意: MySQL 在 8.0 版本(2018 年 4 月 19 日)之前不支持窗口函数。一般来说,窗口函数直到 SQL:2003 才被引入 SQL,正如 MariaDB 的 窗口函数概述 文章中所述。

方法 2: 使用 COUNT(DISTINCT ...) 的相关子查询
简述

如果我们能够计算每个分数 S1.score 的不同分数 S2.score 的数量,而这些分数大于或等于此分数,那么这将有效地给我们提供 S1.score 的排名。然后我们可以按照 S1.score 对结果集进行排序,以符合问题的排名规则。

实现

可以使用 相关子查询 来完成上述的计数。

1.对于来自 Scores 表的每个分数,选择在 Scores 表中大于或等于此分数的不同分数的数量。
2.按照 score 对结果集进行排序。

SELECTS1.score,(SELECTCOUNT(DISTINCT S2.score)FROMScores S2WHERES2.score >= S1.score) AS 'rank'
FROMScores S1
ORDER BYS1.score DESC;

方法 3:使用 INNER JOIN 和 COUNT(DISTINCT...)

简述

这个方法的基本思想与 方法 2 的相同,但实现方式完全不同。

实现

1.将 Scores 表与自身连接,以便我们得到所有分数大于或等于此分数的所有行。
2.将查询行按 id 和 score 值进行分组。
3.计算唯一的分数的数量,它应该大于或等于连接条件中使用的分数(也就是排名)。
4.按 score 值对结果集进行排序。

MYSQL:

SELECTS.score,COUNT(DISTINCT T.score) AS 'rank'
FROMScores SINNER JOIN Scores T ON S.score <= T.score
GROUP BYS.id,S.score
ORDER BYS.score DESC;

上述解决方案是有效的,因为项目是如何分组的--COUNT() 聚合函数在分组上工作,从而为我们提供所需的结果。为了更清楚地看到上述查询的工作原理,我们可以检查以下查询的输出结果:

SELECTS.id AS S_ID,S.score AS S_Score,T.id AS T_ID,T.score AS T_Score
FROMScores SINNER JOIN Scores T ON S.score <= T.score
ORDER BYS.id,T.score;

如果我们将这个查询应用于问题描述中给定的示例数据,那么我们将得到以下结果集:

请注意,当我们在合适的分组上使用 COUNT(DISTINCT ...) 时,这为我们提供了所需的结果集

S_ID = 1;S_score = 3.50:有 4 个不同的 T_score 值(3.50、3.65、3.85 和 4.00)。
S_ID = 2;S_score = 3.65:有 3 个不同的 T_score 值(3.65、3.85 和 4.00)。
...

结论
出于各种原因,我们更喜欢 方法 1,特别是它的简单性、性能和上下文适用性。很少有问题会要求如此恰当地直接应用 DENSE_RANK()。但是,如 方法 1 结尾所述,窗口函数在 SQL 领域的到来相对较新,特别是对于它们在现代开发环境中的使用方式。

在面试环境中,方法 1 是最优的。但如果面试官要求不使用现代 SQL 工具(如窗口函数)来解决问题,使用 方法 2 或 方法 3 也是适当的策略。在这种情况下,方法 2 可能传达对 SQL 查询处理方式的更深入理解,而 方法 3 可能传达解决问题的创造性。无论哪种情况,都传达了一种积极和值得欢迎的特质。

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

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

相关文章

草图大师2024怎么保存低版本呢?插件怎么写?

草图大师是一款流行的绘图和设计软件&#xff0c;为了向后兼容&#xff0c;保存低版本文件时&#xff0c;可以采取以下步骤&#xff1a; su模型库 1.另存为旧版本格式&#xff1a; 在保存文件时&#xff0c;草图大师通常会提供一个选项&#xff0c;让你选择要保存的文件格式和…

智简云携手云器Lakehouse打造一体化大数据平台,释放数据价值

导读 本篇分享的是智简云使用云器Lakehouse升级数据平台的实践总结。 智简云&#xff0c;是一家拥有十余年历史的科技公司&#xff0c;专注于企业服务领域&#xff0c;开发了两款核心产品&#xff1a;基于PASS平台的客户关系管理&#xff08;CRM&#xff09;系统和为中小型用…

Go微服务——go-micro v4安装使用

安装go-micro 打开cmd窗口&#xff0c;执行以下命令 go install github.com/go-micro/cli/cmd/go-microlatest测试是否成功安装 go-micro -v创建服务 go-micro new service helloworldwindows 安装make 安装地址 https://gnuwin32.sourceforge.net/packages/make.htm 配置…

springboot集成达梦数据库8,用springboot+mtbatisplus查询值为空

springboot集成达梦数据库8&#xff0c;用springbootmtbatisplus查询值为空 背景&#xff1a;springboot集成达梦数据库8&#xff0c;用springbootmtbatisplus查询值为空&#xff0c;但是在DB管理工具中是可以查询到数据的。 原因及解决方法&#xff1a;执行添加语句后&#xf…

《MySQL怎样运行的》—InnoDB数据页结构

在上一篇文章中我们讲了&#xff0c;InnoDB的数据页是InnoDB管理存储空间的基本单位&#xff0c;一个页的大小基本为16kb 那你有没有疑问&#xff0c;就是说这个InnoDB的数据页的结构是什么样的&#xff0c;还有他这些结构分别有那些功能~接下来我们一一讲解 数据页的总览结构…

Linux笔记之命令行JSON处理器jq

Linux笔记之命令行JSON处理器jq code review! 文章目录 Linux笔记之命令行JSON处理器jq1.安装2.jq 基本用法3.例程3.1. 示例JSON文件3.2. 读取特定字段3.3. 管道过滤器&#xff08;Pipe Filters&#xff09;3.4. 映射过滤器&#xff08;Map Filters&#xff09;3.5. 条件过滤…

短视频都是怎么剪的:四川京之华锦信息技术公司

短视频都是怎么剪的 随着移动互联网的迅猛发展&#xff0c;短视频已成为人们日常生活中不可或缺的一部分。无论是记录生活的点滴&#xff0c;还是展示个人才艺&#xff0c;短视频都以其短小精悍、直观生动的特点&#xff0c;吸引了众多用户的关注。四川京之华锦信息技术公司那…

自动化重置数据库功能的探索与实践

1、简介 在现代软件开发中&#xff0c;尤其是涉及到数据驱动的应用程序时&#xff0c;开发和测试环境中数据库的管理是至关重要的一环。为了确保开发和测试环境中的数据库始终处于一致的状态&#xff0c;自动化重置数据库成为了一种常见的实践。本文旨在介绍如何通过Shell脚本…

内网(极空间)搭建gitlab跳板机转发端口及域名配置

背景说明 https://blog.csdn.net/GodDavide/article/details/139182475 上文说到: 我已经用docker搭好了gitlab-ce服务&#xff0c;但我是部署在自己的家庭nas-极空间z4pro里的&#xff0c;属于内网环境。 另外我有一台阿里云服务器&#xff0c;做跳板机。 我有一个阿里的域名…

老Java学 Go 笔录(二) 从 go 的编译开始学起

目录 一.版本选择二.环境准备三.工具的选择四.第一个 hello go4.1 开发4.2 编译4.3 编译运行4.4 直接安装 五.用 go 快速搭建 webserver六.调用外部三方方法七.go vs java 的执行 前言 专栏旨在利用现有的 java 体系内容去完成 go 语言的学习. 本次行文是在 https://go.dev/doc…

C# 标识符、变量的命名规范

标识符: 定义的变量名 方法名 类名 等用于识别的内容(变量的命名规范) 命名注意事项: 1.不能以数字开头 2.不能有特殊符号(下划线除外) 3.不能有程序关键字 4.不能重复使用一个名字 命名方法(常用): 驼峰命名法 帕斯卡命名法 不建议使用拼音或汉字命名

迈向2024年,投资无人售货机的盈利能力

在科技进步的浪潮下&#xff0c;无人值守自动售货商店已悄然引领了零售业的新风尚。但关于在2024年开设此类商店是否依旧能实现盈利&#xff0c;这需要一番深思熟虑的分析。 首先不可否认&#xff0c;无人售货机拥有多项显著优势。它打破了传统零售的时间与地点局限&#xff0…

[Linux] 进程概念

目录 1.冯诺依曼硬件体系结构 2.操作系统&#xff08;OS&#xff09; 3.系统接口 4.进程的概念 5.进程状态 6.四个其他概念 7.环境变量 8.进程地址空间 1.冯诺依曼硬件体系结构 在冯诺依曼体系结构中&#xff0c;计算机是由输入、输出、存储设备和中央处理器cpu组成的。图中体结…

Unity 自定义Web GL 发布模板

前言 使用讯飞语音识别时&#xff0c;发布Web GL 平台后需要在index.html 中添加相应的script 标签&#xff0c;但每次发布完添加比较麻烦&#xff0c;添加一个发布模板就可以不必每次发布完再手动添加修改。 实现 在Assets 文件夹下新建一个文件夹&#xff0c;重命名为WebG…

重构2:重构的原则之笔记

最近在看重构2&#xff1a;改善既有代码的设计这本书&#xff0c;对于代码重构指导非常有帮助&#xff0c;然后也是做个笔记记录下&#xff0c;以下是我阅读本书的前两章的时候整理的思维导图&#xff1a;

【示例】MySQL-4类SQL语言-DQL

文章目录 前言DQL | Data Query Language总述 | 涵盖几乎所有关键字的DQL语句单表查询关键字 | 用在Select后面查询内容&#xff1a;表字段查询内容&#xff1a;聚合函数查询内容&#xff1a;[排序函数] [聚合函数] 窗口函数查询内容&#xff1a;表字段函数 关键字 | 用在Where…

【MySQL精通之路】InnoDB(18)-备份与恢复

目录 1.InnoDB备份 1.1 热备份 1.2 冷备份 1.3 使用mysqldump的逻辑备份 2.InnoDB恢复 2.1 实时恢复 2.2 从数据损坏或磁盘故障中恢复 2.3 InnoDB崩溃恢复 2.3.1 表空间发现 2.3.2 Redolog应用程序 2.3.3 未完成交易的回滚 2.3.4 更改缓冲区合并 2.3.5 清除 2.4 …

GPT-3可以用于哪些行业

GPT-3的应用已经渗透到了多个行业&#xff0c;其广泛的用途和强大的能力使得它成为了各行各业的重要工具。以下是一些GPT-3的主要应用领域&#xff1a; 在线客服&#xff1a;GPT-3可以理解和生成人类语言&#xff0c;使得它能够更好地满足用户的需求。它可以根据用户的提问实时…

数据湖对比(hudi,iceberg,paimon,Delta)

Delta 数据湖 Delta 更新原理 update/delete/merge 实现均基于spark的join功能。 定位 做基于spark做流批一体的数据处理 缺点 本质为批处理。强绑定spark引擎。整体性能相较其他数据湖比较差 hudi 数据湖 hudi 更新原理 通过hudi自定义的主键索引hoodiekey 布隆过…

Ali-Sentinel-集群流控

归档 GitHub: Ali-Sentinel-集群流控 测试 参考&#xff1a;热点流控-测试 新建 ClusterDemoApplication2 public class ClusterDemoApplication2 {public static void main(String[] args) {System.setProperty("csp.sentinel.dashboard.server", "127.0.…