[引用]over(Partition by...) 详细用法

 

http://blog.oracle.com.cn/index.php/67239/viewspace-7456.html

常用的分析函数如下所列:

 

示例:
14:33:29 SQL> select type,qty from test;
TYPE QTY
---------- ----------
1 3
1 6
2 5
2 9
2 7

14:33:36 SQL> select type,qty,to_char(row_number() over(partition by type order by qty))||'/'||to_char(count(*) over(partition by type)) as cnt2 from test;
TYPE QTY CNT2
---------- ---------- ------------
1 3 1/2
1 6 2/2
2 5 1/3
2 7 2/3
2 9 3/3

 

SQL> select * from test;

ID MC
---------- --------------------------------------------------
1 11111
2 22222
3 33333
4 44444

SQL>SQL> select t.id,mc,to_char(b.rn)||'/'||t.id
2 from test t,
3 (select rownum rn from (select max(to_number(id)) mid from test) connect by rownum <=mid ) b
where b.rn<=to_number(t.id)
order by id,
6 /

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
4 44444 1/4
4 44444 2/4
4 44444 3/4
4 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;

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值