Bootstrap

【Mysql】函数-----窗口函数

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()做:

用以上三个函数做,我们通过代码可以看出,这三个函数虽然都是序号函数,但是在排序的时候还是有略微的不同。

操作二:求出每个的薪资排在第一名的员工:

用子查询做:

;