oracle的分析函数over(Partition by...)(二)

2014-11-24 16:18:23 · 作者: · 浏览: 4
_number(id)) mid from test) connect by rownum <=mid ))L 4 where b.rn<=to_number(t.id) order by id ID MC TO_CHAR(B.RN)||'/'||T.ID --------- -------------------------------------------------- --------------------------------------------------- 1 11111 1/1 2 22222 1/2 2 22222 2/2 3 33333 1/3 3 33333 2/3 3 33333 3/3 44444 1/4 44444 2/4 4 44444 3/4CNOUG4 44444 4/4 10 rows selected *******************************************************************

关于partition by
这些都是分析函数,好像是8.0以后才有的 row_number()和rownum差不多,功能更强一点(可以在各个分组内从1开时排序) rank()是跳跃排序,有两个第二名时接下来就是第四名(同样是在各个分组内) dense_rank()l是连续排序,有两个第二名时仍然跟着第三名。相比之下row_number是没有重复值的 lag(arg1,arg2,arg3): arg1是从其他行返回的表达式 arg2是希望检索的当前行分区的偏移量。是一个正的偏移量,时一个往回检索以前的行的数目。 arg3是在arg2表示的数目超出了分组的范围时返回的值。
1.  
select deptno,row_number() over(partition by deptno order by sal) from emp order by deptno;  
2.  
select deptno,rank() over (partition by deptno order by sal) from emp order by deptno;  
3.  
select deptno,dense_rank() over(partition by deptno order by sal) from emp order by deptno;  
4.  
select deptno,ename,sal,lag(ename,1,null) over(partition by deptno order by ename) from emp ord er by deptno;  
5.  
select deptno,ename,sal,lag(ename,2,'example') over(partition by deptno order by ename) from em p  
order by deptno;  
6.  
select deptno, sal,sum(sal) over(partition by deptno) from emp;--每行记录后都有总计值  select deptno, sum(sal) from emp group by deptno;  
7. 求每个部门的平均工资以及每个人与所在部门的工资差额  
  
select deptno,ename,sal ,  
     round(avg(sal) over(partition by deptno)) as dept_avg_sal,   
     round(sal-avg(sal) over(partition by deptno)) as dept_sal_diff  
from emp;