sql关键字——with 子查询,row_number()排名函数,lag()函数用法举例

题目:
查询所有选修"英语"的学生成绩与前一名的分数差距,按照成绩降序排序。

针对以上需求,有两种做法

1.使用lag函数

lag()函数,取当前行的上一列,用法是lag(列,往上取的行数,填充值),如lag(score, 1, 0)

表示取score这一列当前行的上一行作为新的一行,若超出窗口范围,则给值为0

lag(score,1,0) over(order by score desc) lag_score
1.取上一行的分数
selectname,subject,score,lag(score,1,0) over(order by score desc) lag_score
from default.score
where subject = '英语'
2.将两个分数相减

考虑到第一名同学没有上一行数据,给予0

if(lag_score - score > 0, lag_score - score, 0) score_diff
3.最终SQL
selectname,score,lag_score,if(lag_score - score > 0, lag_score - score, 0) score_diff
from
(selectname,subject,score,lag(score,1,0) over(order by score desc) lag_scorefrom default.scorewhere subject = '英语'
)t1

2.使用排名函数row_number来解决

思路:
问题:排名总数会减少?

rank()函数在进行排名时,值相同,总数排名会跳过,这样在进行关联时,等号左右两边关联不上,数据减少。

所以这里使用row_number()进行排名,分数相同,排名顺序递增。

1.取当前学生的分数排名
    使用with表达式,很好的提高了SQL复用性

     这里将排名存储在虚表中,避免二次查询。

with RankScore as (selectname,subject,score,-- 使用rank()导致排名减少,造成关联不上row_number()  over(partition by subject order by score desc) rk
from default.score
where subject = '英语'
)
2. 关联该同学的排名与他的上一名排名, 将当前排名 = 上一行排名 + 1, 差值为1,即为本行与上一行
selectfrom RankScore a-- 当前名与上一名学生的差距。
join RankScore b on a.rk = b.rk + 1
order by a.score desc
3. 使用当前行分数-上一行分数,得到分差
selecta.name,a.subject,a.score,a.score - b.score as score_diff
from RankScore a-- 当前名与上一名学生的差距。
join RankScore b on a.rk = b.rk + 1
order by a.score desc
4.最终SQL
with RankScore as (selectname,subject,score,-- 使用rank()导致排名减少,造成关联不上row_number()  over(partition by subject order by score desc) rk
from default.score
where subject = '英语'
)selecta.name,a.subject,a.score,a.score - b.score as score_diff
from RankScore a-- 当前名与上一名学生的差距。
join RankScore b on a.rk = b.rk + 1
order by a.score desc

通过这道题,我们学习了排名函数、虚拟表的使用。

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

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

相关文章

jquery 合并table表格行或列

合并行 $("#tableId").find("tr").each(function(rowIndex) {var cells $(this).find("td");cells.each(function(cellIndex) {var cell $(this);var prevRowCell table.find("tr:eq(" (rowIndex - 1) ")").find(&quo…

05、Kafka ------ 各个功能的作用解释(主题和分区 详解,用命令行和图形界面创建主题和查看主题)

目录 CMAK 各个功能的作用解释(主题)★ 主题★ 分区★ 创建主题:★ 列出和查看主题 CMAK 各个功能的作用解释(主题) ★ 主题 Kafka 主题虽然也叫 topic,但它和 Pub-Sub 消息模型中 topic 主题及 AMQP 的 t…

WPF 基础入门(资源字典)

资源字典 每个Resources属性存储着一个资源字典集合。如果希望在多个项目之间共享资源的话,就可以创建一个资源字典。资源字段是一个简单的XAML文档,该文档就是用于存储资源的,可以通过右键项目->添加资源字典的方式来添加一个资源字典文件…

RT-Thread:ADC 框架应用,通过 STM32CubeMX 配置 STM32 ADC驱动

关键词:ADC,RT-Thread ADC,STM32 ADC应用 说明:本笔记是记录如何开启 RT-Thread 框架的ADC功能,使用系统自带的ADC函数,并通过 STM32CubeMX 配置 STM32 ADC驱动 。 1. 打开board.h 文件,找到ADC 使用配置的流程&…

联络口译重要吗?怎样选择专业的翻译公司?

联络口译在当今全球化的时代扮演着至关重要的角色。随着国际交流与合作的日益频繁,无论是商务、政治还是文化领域,都需要专业的口译员进行准确的沟通。尤其是在跨语言、跨文化的背景下,联络口译对于保障沟通的顺利进行起着不可替代的作用。那…

IDEA在package下右键,没有new选项

正常情况下如下图,我们在文件夹上右键,是会出现New选项的。 但是今天我尝试将" add frameworks support"添加到右键时,竟然把New都删除了。如下图 搜遍全网,结果搜到的都是为什么在package或者文件夹上右键出现的Ne…

分类预测 | Matlab实现RP-LSTM-Attention递归图优化长短期记忆神经网络注意力机制的数据分类预测【24年新算法】

分类预测 | Matlab实现RP-LSTM-Attention递归图优化长短期记忆神经网络注意力机制的数据分类预测【24年新算法】 目录 分类预测 | Matlab实现RP-LSTM-Attention递归图优化长短期记忆神经网络注意力机制的数据分类预测【24年新算法】分类效果基本描述模型描述程序设计参考资料 分…

软件测试|MySQL WHERE条件查询详解:筛选出需要的数据

简介 在数据库中,我们常常需要从表中筛选出符合特定条件的数据,以便满足业务需求或获取有用的信息。MySQL提供了WHERE条件查询,使我们能够轻松地筛选数据。本文将详细介绍MySQL WHERE条件查询的用法和示例,帮助大家更好地理解和应…

FineBI实战项目一(7):每天每小时上架商品个数

1 明确数据分析目标 对所有商品的商家时间进行统计,统计每个小时上架商品的个数 2 创建用于保存数据分析结果的表 create table app_hour_goods(id int primary key auto_increment,daystr varchar(20),hourstr varchar(20),cnt int ); 3 编写SQL语句进行数据分析…

分析一个项目(微信小程序篇)一

分析一个项目讲究的是如何进行对项目的解析分解,进一步了解项目的整体结构,熟悉项目的结构,能够知道每个组件所处在哪个位置,发挥什么作用。 本次所介绍的是微信小程序项目(甑选商场): 其首页…

Spring——Spring整合MyBatis

Spring整合MyBatis 1.创建工程 1.1.pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"…

Unity文字转语音(使用RT-Voice PRO [2023.1.0])

参考文章Unity插件——文字转朗读语音RtVioce插件功能/用法/下载_rtvoice-CSDN博客 一、使用步骤 1.导入进Unity&#xff08;插件形式为 .unitypackage&#xff09; https://download.csdn.net/download/luckydog1120446388/88717512 2.添加所需Prefab 1&#xff09;.右键可…