背景:在做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即可