MySQL中实现开窗函数

一、概述

row_number是数据库中常用的一个开窗函数,可以实现数据分区编号的功能,然而MySQL并不支持开窗函数。本文介绍了在MySQL中实现开窗函数的方法。

二、经典开窗函数

首先准备基础数据,如下入所示。

MySQL中实现开窗函数_第1张图片

在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允许用户自定义变量,语法为@var_name,赋值方式为“:=”,并支持基本数学计算,例如,@row_number:=0表示定义变量row_number并赋值为0,@row_number + 1 表示row_number的值加1。

下面分析分组编号的执行过程。a表按照age和name排序,@previous_age记录上一行数据的age。@previous_age的初始值为0,执行过程,逐一和当前记录的age比较,如果@previous_age=a.age,说明当前记录和前面的记录是同一个年龄,那么将row_number加1;如果@previous_age != a.age,说明当前记录是一个新的年龄,那么将row_number赋值为1。所有数据扫描完成后,也就完成了分组编号。
 

你可能感兴趣的:(MySQL数据库,#,HIVE)