1.1.1 over 分析函数用法
1. 用法
sum(salary) over( order by employee) --按照员工的薪水逐条累计显示
sum(sal) over (partition by deptno order by ename) --分部门连续求总和
sum(sal) over (partition by deptno) --分部门求总和
sum(sal) over (order by deptno,ename) --按部门、员工连续求总和
sum(sal) over () --不按部门,求所有员工总和,效果等同于sum(sal)
2. 使用
--例如:
select ename,
sal,
sum(sal) over(order by ename) 连续求和,
sum(sal) over() 总和,
100 * round(sal / sum(sal) over(), 4) "份额(%)"
from emp;
ENAME SAL 连续求和 总和 份额(%)
---------- ---------- ---------- ---------- ----------
ADAMS 1100 1100 29025 3.79
ALLEN 1600 2700 29025 5.51
BLAKE 2850 5550 29025 9.82
CLARK 2450 8000 29025 8.44
/*体会说明:在"... from emp;"后面不要加order by 子句,
使用的分析函数的(partition by deptno order by sal)里已经有排序的语句了,
如果再在句尾添加排序子句,一致倒罢了,不一致,结果就令人费劲了*/
1.1.2 Rank() 分析函数用法
1. 用法
rank() over( partition by col1 order by col2)
dense_rank over( partition by col1 order by col2)
功能:按照col1进行划分,并根据col2排序的结果给col评级,如果col2值相同,则评级值相同。
区别【dense_rank与rank()】:dence_rank 在处理相同的等级时,等级的数值不会跳过。
rank则跳过,即rank的级值可能是不连续的。
2. 使用
--例如:表test3:A B C
a liu wang
a jin shu
a cai kai
b yang du
b lin ying
b yao cai
b yang 99
--例如:当rank时为:
select m.a,m.b,m.c,rank() over(partitionby a orderby b) liu from test3 m;
A B C LIU
a cai kai 1
a jin shu 2
a liu wang 3
b lin ying 1
b yang du 2
b yang 99 2
b yao cai 4 --区别
--而如果用dense_rank时为:
select m.a,m.b,m.c,dense_rank() over(partitionby aorderby b) liu from test3 m;
A B C LIU
a cai kai 1
a jin shu 2
a liu wang 3
b lin ying 1
b yang du 2
b yang 99 2
b yao cai 3 --区别