【SQL】分数排名

embedded/2024/10/17 19:35:10/

目录

语法

需求

示例

分析

代码


语法

 dense_rank() over (order by score desc) as 'rank'

 SQL 中的一个窗口函数(Window Function),用于对查询结果集中的行进行排名。这个函数特别适用于需要对某个字段(如分数、销售额等)进行排序并赋予排名的场dense_rank():

  • dense_rank()
    • dense_rank() 是一个窗口函数,用于为结果集中的每一行分配一个唯一的排名。
    • 与 rank() 函数不同,dense_rank() 在处理相同值时不会跳过排名。也就是说,如果有两行具有相同的值,它们将被赋予相同的排名,而下一行的排名将紧接着这两个相同的排名之后,不会跳过任何数字。
  • over (order by score desc):
    • over 子句定义了窗口函数的操作范围,以及如何在结果集中对行进行排序。
    • order by score desc 指定了排序的依据是 score 字段,并且是按照降序(从高到低)排序。这意味着分数最高的行将被赋予最高的排名。
  • as 'rank':
    • as 'rank' 是一个别名子句,用于将 dense_rank() 函数的结果列命名为 rank。
    • 在 SQL 中,单引号通常用于字符串字面量。如 MySQL可能允许使用单引号作为别名,但这并不是标准 SQL 的做法。

<窗口函数> OVER ([PARTITION BY <分区列>] [ORDER BY <排序列>] [ROWS <行范围>])

窗口函数可以对查询结果集中的行进行分组、排序,并在每个分组内进行聚合、排名、计算等操作,而不会改变原始查询结果的行数或顺序。与常规的聚合函数(如SUM、AVG、COUNT等)不同,窗口函数允许在结果集中的每一行上进行计算,而不需要将数据分组。窗口函数提供了对每一行的子集(称为窗口)执行计算的能力,同时保留原始数据行的上下文信息。

  • <窗口函数>:代表要执行的窗口函数,如SUM、AVG、ROW_NUMBER等。
  • PARTITION BY 子句:用于将数据分成不同的分区,窗口函数将在每个分区内执行。类似于查询语句中的GROUP BY子句,但窗口函数不会将分区内的数据行合并成一行输出。
  • ORDER BY 子句:定义数据的排序方式,决定窗口函数的计算顺序。排序选项通常用于数据的分类排名。
  • ROWS 子句:指定窗口的范围,可以是行数、区间等。用于实现复杂的分析功能,如计算累计和、移动平均等。

需求

表: Scores

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

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

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

按 score 降序返回结果表。
 

示例

输入: 
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    |
+-------+------+

分析

分数应按从高到低排列。

考虑 order by,order by desc可以使得分数从高到底排列

如果两个分数相等,那么两个分数的排名应该相同。

在排名相同的分数后,排名数应该是下一个连续的整数。换句话说,排名之间不应该有空缺的数字。

需要输出排名,考虑 rank()函数。

要求相同分数的排名应该相同,进一步需要dense_rank()函数

与 rank() 函数不同,dense_rank() 在处理相同值时不会跳过排名。也就是说,如果有两行具有相同的值,它们将被赋予相同的排名,而下一行的排名将紧接着这两个相同的排名之后,不会跳过任何数字。

引入rank列按照降序展现排名

order by score desc 指定了排序的依据是 score 字段,并且是按照降序(从高到低)排序。这意味着分数最高的行将被赋予最高的排名。dense_rank() over (order by score desc) as 'rank'

代码

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


http://www.ppmy.cn/embedded/128248.html

相关文章

视频去水印软件3款推荐:好用的去水印软件分享!

在处理视频素材时&#xff0c;水印往往是一个令人头疼的问题。幸运的是&#xff0c;市面上有许多优秀的视频编辑软件能够帮助我们快速、有效地去除水印。今天&#xff0c;我将为大家推荐三款功能强大的视频去水印软件&#xff1a;影忆、Final Cut Pro X以及Adobe Premiere Pro&…

可以在桌面上用的倒计时提醒app下载

在忙碌的工作日常中&#xff0c;我们常常需要记住各种截止日期和重要事件。为了确保这些任务按时完成&#xff0c;一款桌面倒计时提醒应用变得尤为重要。想象一下&#xff0c;当你在电脑桌面上就能清晰地看到剩余时间&#xff0c;这无疑会增加你的工作效率和紧迫感。 敬业签就…

React入门(1)——我的第一个React.js项目

创建日期: 2020年2月22日 官网 中文官方文档 React入门系列 目录导引 一.使用create-react-app命令创建 React 官方提供了一个脚手架用于初始化React项目&#xff0c;使用 create-react-app 可以简化手动设置流程。 官方网站的 Tutorial 也是以此为例。 注意&#xff1a;项目命…

#### failed to build some targets (12 seconds) ####

[TOC](#### failed to build some targets (12 seconds) ####) 问题分析解决 这个要注意看log信息&#xff0c;是代码出错了 Error: xx/rk3568-evb.dtsi:188.27-28 syntax error FATAL ERROR: Unable to parse input tree需要根据报错的提示去找问题

Flume面试整理-常见的Sink类型

Apache Flume中的Sink(汇)用于将数据从Channel(通道)中读取并发送到目标存储系统或处理系统。Flume支持多种类型的Sink,以下是Flume中常见的Sink类型及其特点: 1. HDFS Sink ● 描述:将数据写入Hadoop分布式文件系统(HDFS)。常用于日志数据的批量存储和后续处理。 ● …

VMWare NAT 模式下 虚拟机上不了网原因排查

vmware 按照了Linux之后 无法上网&#xff0c;搞定后&#xff0c;记录一些信息。 window有两个虚拟网卡 VMnet1 对应的是 Host-Only&#xff08;仅主机模式&#xff09; VMnet8 对应的是 NAT&#xff08;网络地址转换模式&#xff09; 在NAT模式中&#xff0c;需要设置NAT和D…

UDP反射放大攻击防范手册

UDP反射放大攻击是一种极具破坏力的恶意攻击手段。 一、UDP反射放大攻击的原理 UDP反射放大攻击主要利用了UDP协议的特性。攻击者会向互联网上大量的开放UDP服务的服务器发送伪造的请求数据包。这些请求数据包的源IP地址被篡改为目标受害者的IP地址。当服务器收到这些请求后&…

深度学习:循环神经网络 --- LSTM网络原理

LSTM网络的介绍 循环神经网络&#xff08;Recurrent Neural Networks&#xff0c;RNN&#xff09;是一种用于处理序列数据的神经网络&#xff0c;它能够处理任意长度的序列&#xff0c;并且能够保持对之前数据的记忆。LSTM&#xff08;Long Short-Term Memory&#xff09;网络是…