一.先解释什么是窗口函数
首先,我们要知道什么是窗口子句:
需要指定一个窗口的边界,语法是这样的:
ROWS betweenCURRENT ROW | UNBOUNDED PRECEDING | [num] PRECEDING AND UNBOUNDED FOLLOWING | [num] FOLLOWING| CURRENT ROW
或
RANGE between [num] PRECEDING AND [num]FOLLOWING
如下图:
ROWS是物理窗口,从行数上控制窗口的尺寸的;
RANGE是逻辑窗口,从列值上控制窗口的尺寸。这个比较难理解,但说白了就简单了
普通的聚合函数用group by分组,
每个分组
返回一个统计值,而分析函数采用partition by分组,并且
每组每行
都可以返回一个统计值
开窗函数over(),包含三个分析子句:分组(partition by), 排序(order by), 窗口(rows) ,
他们的使用形式如下:over(partition by xxx order by yyy rows between zzz)
窗口就是分析函数分析时要处理的数据范围
,就拿sum来说,它是sum窗口中的记录而不是整个分组中的记录,因此我们在想得到某个栏位的累计值时,我们需要把窗口指定到该分组中的第一行数据到当前行, 如果你指定该窗口从该分组中的第一行到最后一行,那么该组中的每一个sum值都会一样,即整个组的总和。
注释:
当
开窗函数over()
出现分组(partition by)子句时,
unbounded preceding即第一行是指表中一个分组里的第一行, unbounded following即最