1.开窗函数
1.聚合类开窗
max() min() avg() sum() count()
特点
1.开窗函数内必须要有内容
2.分析子句没有硬性要求
3.聚合类开窗中 order by 子句不光有排序的功能,还可以实现累计
累计计数 count,累计求和 sum,累计取平均 avg,;累计取最大 max,min;
2.排序类开窗
row_number() rank() dense_rank()
注意点
1-排序类开窗函数的括号内不能放任何内容
2-排序类开窗函数的over() 括号中必须要有 order by
3-row_number()over() 单纯的返回当前记录在窗口中所处的位置行号,该行号有唯一性
rank()over() 排序结果中出现相同的记录时,有并列的序号,下一个排名具有跳跃性---跳号
dense_rank()over() 排序结果中出现相同的记录时,有并列的序号,下一个排名不具有跳跃性---不跳号
3.偏移类开窗
lag()over(order by) --向下偏移
lead()over (order by ) --向上偏移
实际中的应用
同比
同比: 当年某一时期的数据与上一年同一时期的数据去比较 比如24 年7月和 23年7月 去比较
--同比增长率: (本年-上年)/上年
环比
环比: 当年某一时期的数据与本年上一时期的数据去比较 比如24 年7月和 24年6月 去比较
--环比增长率: (本期-上期)/上期
2.集合运算
1.并集
union --去重
union all --不去重
select * from emp where deptno=10
union all
select * from emp where sal>2000; 相加
2.交集
intersect
select * from emp where deptno=10
intersect
select * from emp where sal>2000; --取相同部分
3.差集
minus
select * from emp where deptno=10
minus
select * from emp where sal>2000; --前面的减去与后面的共同部分
3.行列转换
1.行转列 --竖表转横表
pivot
例:查询各个岗位在不同部门下的人数
select * from 表名 pivot(聚合函数 for 要转换的字段 in (要转换的字段的值));
select * from (select deptno, job from emp) pivot(count(1) for job
in('CLERK' as CLERK , 'SALESMAN', 'MANAGER', 'PRESIDENT', 'ANALYST'));
2.列转行 ---横表转竖表
unpivot
语法:select * from 表名 unpivot(新列名1 for 新列名2 in (值1,值2,值3...));