MySQL8 新特性窗口函数详解
MySQL中的窗口函数
函数(Function)的类型
目前支持的窗口函数可结合的函数有:
序号函数 ROW_NUMBER();
排名函数 RANK() 和 DENSE_RANK();
⭐️row_number()、rank() 和dense_rank() 三种排序函数的区别:
row_number:每一行记录生成一个序号,依次排序且不会重复。 1234...
rank:跳跃排序,生成的序号有可能不连续。1134..
dense_rank:在生成序号时是连续的。1123...错行函数 lead()、lag();
取值函数 First_value()和last_value();
分箱函数 NTILE();
统计函数,也就是我们常用的聚合函数 MAX()、MIN()、AVG()、SUM()、COUNT()
over()子句
在Function函数之后需要跟上一个窗口函数over(),over()函数参数包括了三个子句(分组子句,排序子句和窗口子句),根据实际需求选择子句:
partition by query_patition_clause:即分组,通过query_patition_clause进行分组,一般是表中的某一个字段,所以可以把partition by 看作与GROUP BY 具有相同功能的语法。
order by order_by_clause:即排序,通过order_by_clause 进行排序,一般是在分组(partition by)之后再进行排序,如此一来,就是在组内进行排序。如果没有前面的分组子句(partition by),那么就是全部数据进行排序。和普通MySQL中的查询语句一样,排序从句也支持ASC和DESC的用法。
frame_clause:窗口从句,它是排序之后的功能扩展,它标识了在排序之后的一个范围,它的格式是:
rows | range between start_expr and end_expr
其中rows和range为二选其一:
rows是物理范围,即根据order by子句排序后,取的前N行及后N行的数据计算(与当前行的值无关,只与排序后的行号相关);
range是逻辑范围,根据order by子句排序后,指定当前行对应值的范围取值,行数不固定,只要行值在范围内,对应行都包含在内(当range和preceding/following一起使用时,使用的数据类型必须与order by表达式的数据类型相同);
between…and...用来指定范围的起始点和终结点,start_expr为起始点,end_expr为终结点(以当前行为起点或终点时,between…and…可省略)
Start_expr为起始点,起始点有下面几种选项:
unbounded preceding:指明窗口开始于分组的第一行,以排序之后的第一行为起点;
current row:以当前行为起点;
n preceding:以当前行的前面第n行为起点;
n following:以当前行的后面第n行为起点;
date范围用INTERVAL 6 DAY PRECEDING(前6天)
end_expr为终结点,终结点有下面几种选项:
unbounded following:以排序之后的最后一行为终点;
current row:以当前行为终点;
n preceding:以当前行的前面第n行为终点;
n following:以当前行的后面第n行为终点;
date范围用INTERVAL 6 DAY FOLLOWING(后6天)