开窗函数的一个概念是当前行,当前行属于某个窗口,窗口由over关键字来指定函数执行的窗口范围,如果后面括号中什么都不写,则意味着窗口包含满足where条件的所有行,开窗函数基于所有行进行计算;如果不为空,则有三个参数来设置窗口: partition by子句:按照指定字段进行分区,两个分区由边界分隔,开窗函数在不同的分区内分别执行,在跨越分区边界时重新初始化。 order by子句:按照指定字段进行排序,开窗函数将按照排序后的记录顺序进行编号。可以和partition by子句配合使用,也可以单独使用。 frame子句:当前分区的一个子集,用来定义子集的规则,通常用来作为滑动窗口使用。
示例1
有个员工表emp,查询所有员工的平均工资, select *,avg(sal) over() 所有员工平均工资 from emp;#当over中没有指定分区、排序和滑动窗口时,将整个表作为一个区,默认计算的是平均工资
示例2
查询各部门平均工资 select *,avg(sal) over(partition by deptno) 部门平均工资 from emp; #当over中指定了分区,但是没有指定排序和滑动窗口时,默认计算的是当前分区内的平均工资
示例3
开窗函数滑动窗口求移动平均工资 #实现效果是 部门分区后 当前行的前一行和后一行求平均工资 (相当于求移动平均工资) select *,avg(sal)over(partition by deptno order by hiredate rows between 1 preceding and 1 following) as 移动平均工资from emp; 从上述示例中可以看到开窗函数和普通聚合函数的区别: 1.聚合函数是将多条记录聚合为一条;而开窗函数是每条记录都会执行,有几条记录执行完还是几条。 2.聚合函数也可以用于开窗函数中。 实际工作中,还有比较多常用开窗函数,动态窗口函数有first_value(), last_value(), nth_value()等,其实基本语法都差不多,如果遇到业务需求再网上查找帮助文档让你事半功倍。