1013.oracle中窗口函数

1.分析函数排序
① row_number() over(partition by xxx order by xxx)
每一组里面编号,不管重复的
② rank() over(partition by xxx order by xxx)
每一组里面编号,重复的同号,重复的后面会跳号
③ dense_rank() over(partition by xxx order by xxx)
每一组里面编号,重复的同号,重复的后面会跳号
先分组,后排序;分组是根据partition by 后面的,排序编号是根据order by后面的,跳不跳号看函数名意思
 
2.分析函数统计
④ sum(sal) over(partition by deptno) 
按部门分组,求各个部门内部工资总和
⑤ sum(sal) over(partition by deptno order by sal)
按部门分组,按部门内的工资排序 递增求和——累加
⑥ avg(sal) over(partition by deptno)
按部门分组,求各个部门内部平均工资
⑦ avg(sal) over(partition by deptno order by sal)
按部门分组,求各个部门工资排序 递增求平均工资
⑧ count(sal) over(partition by deptno) 
按部门分组,求各个部门内部工资个数
⑨ count(sal) over(partition by deptno order by sal)
按部门分组,按部门内的工资排序 递增计数
⑩ max(sal) over(partition by deptno)
按部门分组,求各个部门内部最高工资
⑪ max(sal) over(partition by deptno order by sal)
按部门分组,求各个部门工资排序递增求最高工资
⑫ min(sal) over(partition by deptno)
按部门分组,求各个部门内部最低
⑬ min(sal) over(partition by deptno order by sal)
按部门分组,求各个部门工资排序递增求最低工资
先分组,在分析;分组是根据partition by 后面的,看排不排序分析(看有没有order by),没有order by(就是默认排序)直接就组内多行一起分析,有order by 就排序分析,排进来一条就分析一次。
 
3.分析函数移位
⑭lag(sal,1,null) over(order by sal)
针对sal这一列,先根据order by sal排序,再将sal这一列向后(排序的序号)移一位(根据中间参数确定移几位),后面的几位会被去掉(不显示),前面的几位补充null(根据第三个参数来填充)
⑮lead(sal,1,null) over(order by sal)
针对sal这一列,先根据order by sal排序,再将sal这一列向前(排序的序号)移一位(根据中间参数确定移几位),前面的几位会被去掉(不显示),后面的几位补充null(根据第三个参数来填充)
lag/lead(column_name, move_number, value_to_in)
 
4.开窗说明
rows between 和 range between 的区别:
rows between 是在开窗窗口内按行 统计
range between 是在窗口内按差异(相同的一起)统计(会有行重复)
⑯ sum(sal) over(order by sal rows between {unbounded preceding | current row} and { current row | unbounded following)开窗(类似于分页)
⑰ sum(sal) over(order by sal rows between {unbounded preceding | current row} and { current row | unbounded following)开窗(类似于分页)
select ename,
       deptno,
       sal,
       sum(sal) over(order by sal) 累加,
       sum(sal) over(order by sal rows between unbounded preceding and current row) 开头到中间,
       sum(sal) over(order by sal rows between unbounded preceding and unbounded following) 开头到末尾,
       sum(sal) over(order by sal rows between current row and unbounded following) 中间到末尾,
       sum(sal) over(order by sal rows between current row and current row) 中间到中间,
       sum(sal) over(order by sal) 累加
  from emp;
posted @ 2021-01-13 00:08  bufuzhou  阅读(301)  评论(0编辑  收藏  举报