开窗函数:
语法:开窗函数名([<字段名>]) over([partition by <分组字段>] [order by <排序字段> [desc]] [<
滑动窗口>])
partition by子句:按照指定字段进行分区,两个分区由边界分隔,开窗函数在不同的分区内分别
执行,在跨越分区边界时重新初始化。
order by子句:按照指定字段进行排序,开窗函数将按照排序后的记录顺序进行编号。可以和
partition by子句配合使用,也可以单独使用。
frame子句:当前分区的一个子集,用来定义子集的规则,通常用来作为滑动窗口使用
例子;
- 查询员工的平均工资: select *,avg(sal) over() as 平均工资 from emp;
- 查询每个部门员工的平均工资: ①聚合函数:select deptno,avg(sal) from emp group by deptno; ②开窗函数:select *, avg(sal) over(partition by deptno) as 部门平均工资 from emp; 注释:#当over中指定了分区,但是没有指定排序和滑动窗口范围时,默认计算的是分区内的所有行
- – 查询各部门入职先后顺序的累计工资
select *,sum(sal) over(partition by deptno order by hiredate) as 累计工资 from emp;
– 查询各部门入职先后顺序的前一位到后一位员工的平均工资
select *,avg(sal) over(partition by deptno order by hiredate rows between 1 preceding and 1 following ) as 平均工资 from emp;
#当over中指定了分区、排序和滑动窗口范围时,计算的是指定范围内的所有行