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 --区别