Mysql 5.7 用sql实现窗口函数

在MySQL低版本中,缺少窗口函数使得数据清洗变得复杂。本文通过一个学生成绩表的例子,展示了如何利用SQL分组和排序来模拟窗口函数的效果,获取每个学生最新的成绩。具体实现是通过设置变量并结合子查询,根据学号分组和更新时间降序排序,最终通过rn=1选取最新记录。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

背景:在做BI项目或者数仓的时候我们经常会用到窗口函数来清洗数据,但是很多企业的Mysql数据库还是停留在低版本,我们都知道低版本的Mysql数据库是没有窗口函数的,这个时候清洗数据的时候就很麻烦了,今天卡拉就教大家一手如何sql实现窗口函数

假设我们有这样一个场景,如下图有一个学生成绩表,在试卷未下发之前学生的成绩已经录入系统了,但是试卷下发之后有可能出现学生成绩变动的情况,这个时候表里面可能存在同一个学生不同成绩的情况。这个时候我们就需要根据学生学号分组,并且根据最后更新时间降序排序来获取到该学生最新的成绩,但是很可惜mysql版本比较低,并没有窗口函数。

实现过程:

select
 *
from (
	select 
		@rn := case when @stuno = a.stuno then @rn + 1 -- 如果学号相等则rn+1
			   else 1
		end as rn,
		@stuno := a.stuno,  -- 给变量赋值
		a.stuno,
		a.name,  
		a.score,
	  a.last_update
	from (select * from stucore order by name,last_update desc) a,  -- 这里需要根据分组字段和排序字段进行排序
	(select @rn = 0,@stuno='') b		-- 定义变量
) a

 结果:我们可以看出张三这名学生的成绩已经被我们拿到了,最后只需要加一个where条件取rn = 1即可

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值