一、概述
row_number是数据库中常用的一个开窗函数,可以实现数据分区编号的功能,然而MySQL并不支持开窗函数。本文介绍了在MySQL中实现开窗函数的方法。
二、经典开窗函数
首先准备基础数据,如下入所示。
在hive或oracle中使用经典开窗函数实现数据分组编号的方法如下。
select name,
age,
row_number() over (partition by age order by name) as rank
from student
但是,MySQL中并不支持上述开窗函数。
三、MySQL实现开窗函数的方法
select @row_number:=
case when @previous_age = a.age then @row_number + 1
else 1
end as num,
`name`,
age,
@previous_age:=a.age
from
a, (select @previous_age:=0, @row_number:=0) as b
order by age,`name`
其中表a为上述的学生年龄表。
MySQL允许用户自定义变量,[email protected]_name,赋值方式为“:=”,并支持基本数学计算,例如,@row_number:=0表示定义变量row_number并赋值为0,@row_number + 1 表示row_number的值加1。
下面分析分组编号的执行过程。a表按照age和name排序,@[email protected]_age的初始值为0,执行过程,逐一和当前记录的age比较,[email protected]_age=a.age,说明当前记录和前面的记录是同一个年龄,那么将row_number加1;[email protected]_age != a.age,说明当前记录是一个新的年龄,那么将row_number赋值为1。所有数据扫描完成后,也就完成了分组编号。