1、介绍
Mysql 8.0 新增了窗口函数,窗口函数又被称为开窗函数,与orcale窗口函数相似,属于Mysql的一大特点。非聚合函数是相对于聚合函数来说的。聚合函数是一组数据计算后返回单个值(即分组)。非聚合函数一次只会处理一行数据。窗口聚合函数在行记录上计算某个字段的结果时,可将窗口范围内的数据输入到聚合函数中,并不改变行数。
2、分类
1))序号函数(用于排序):row_number(), rank(), dense_rank();
2))分布函数:cume_dist(), percent_rank(),
3))前后函数:lag(expr,n), lead(expr,n);
4))头尾函数:first_value(expr) , last_value(expr);
5))其它函数:nth_value(expr,n); ntile(n);
另外还有开窗聚合函数:sum, avg , min , max;
开窗聚合函数:即具有聚合函数的特点,又具有窗口函数的特点。
3、语法结构
window_function(expr) over(
partition by...
order by...
frame_clause
)
其中,window_function是窗口函数的名称,expr是参数,有些函数不需要参数;over 子句包含三个选项:
(1)分区(partition by)
partition by 选项用于将数据行拆分成多个分区(组),它的作用类似于Group by 分组,如果省略了partition by , 所有的数据将作为一个组进行处理。
(2)排序(order by)
over子句中的order by 选项用于指定分区内的排序方式,与order by 子句的作用相似。
(3)窗口大小
frame_clause 选项用于在当前分区内指定一个计算窗口,也就是一个与当前行相关的数据子集。
4、序号函数
序号函数有三个:row_number(), rank(), dense_rank(), 可以用来实现分组排序并添加序号。
(1)操作:
创建表employee表:
向表中插入数据:
操作一:对每个部门的员工按照薪资降序并给出排名:
第一种方法:用row_number()做:
第二种方法:用rank()做
第三种方法:用dense_rank()做:
用以上三个函数做,我们通过代码可以看出,这三个函数虽然都是序号函数,但是在排序的时候还是有略微的不同。
操作二:求出每个的薪资排在第一名的员工:
用子查询做: