窗口函数与普通聚合函数的区别:
窗口函数用于计算基于组的某种聚合值,它和聚合函数的不同之处是:对于每个组返回多行,而聚合函数对于每个组只返回一行。
一、基本语句形式:
Function(arg1,...) over(partition by ... order by ... Window_clause)
Window_clause: rows | range between start_expr and end_expr
Start_expr: unbounded preceding | current row | n preceding | n following
End_expr: unbounded following | current row | n preceding | n following
窗口函数带有一个开窗函数over(),包含三个分析子句:分组(partition by)、排序(order by),即order_by_clause、窗口(rows),即Window_clause。
二、函数形式
按照功能划分,可以把MySQL支持的窗口函数分为如下几类:
排序函数:row_number() / rank() / dense_rank()
分布函数:percent_rank() / cume_dist()
前后函数:lag() / lead()
头尾函数:first_val() / last_val()
其他函数:nth_value() / nfile()
排序函数
row_number() / rank() / dense_rank()
用途:显示分区中的当前行号
使用场景:希望查询每个用户订单金额最高的前三个订单
PS:rank和dense_rank这两个函数和row_number()非常类似,只是在出现重复值时处理逻辑有所不同。rank()是跳跃排序,有两个第二名时接下来就是第四名,不会出现第三名;dense_rank()是连续排序,有两个第二名时仍然跟着第三名。
当有空值时,可设置空值优先排序或者最后排序,order by amount NULLS LAST