锁定老帖子 主题:oracle——分析函数OVER ()
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
作者 | 正文 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
发表时间:2010-01-20
最后修改:2010-01-21
table:oracle用户scott下的emp表 ; 一. Oracle 从8.1.6开始提供分析函数,分析函数用于计算基于组的某种聚合值,它和聚合函数的不同之处是 对于每个组返回多行,而聚合函数对于每个组只返回一行。 exp: select t.empno,t.ename,sum(t.sal) from emp t 这样会报:ORA-00937:非单组分组函数; 结论:聚合函数只能返回1行值。 select t.empno,t.ename,sum(t.sal)over() sum from emp t 返回的结果:
结论:这就是每个组返回多行。 二. over()、over(order by...)与over(partition by...)之间的区别 1.分析函数over()用在聚合函数(max(),sun()....)后面,可返回多行所有结果的聚合值; exp:如上; 2.over(order by...)用在聚合函数(max(),sun()....)后面,可返回根据排序结果进行统计到当前行的聚合值(即“连续”统计); exp: select t.empno, t.deptno, t.ename, t.sal, sum(t.sal) over(order by t.ename) sum from emp t 返回的结果:
分析:第二行的sum=第一行里的sal+第二行里的sal; 第二行的sum=第一行里的sal+第二行里的sal+第三行里的sal; ..... 结论:返回值是根据排序后的结果,当前所在的行进行统计的。 3.over(partition by...)用在聚合函数(max(),sun()....)后面,可根据pratition by里指定的某一列来统计聚合值。 exp: select t.empno, t.deptno, t.ename, t.sal, sum(t.sal) over(partition by t.deptno) sum from emp t 返回的结果:
分析:每个sum的值都是把deptno相同的sal值进行求和。 结论:根据pratition by里指定的某一列来统计聚合值。 三.一个综合的例子: exp: question: 按部门“连续”求总和; answer: select t.empno, t.deptno, t.ename, t.sal, sum(t.sal) over(partition by t.deptno order by t.ename) sum from emp t 返回的结果:
分析:先根据partition by 进行分组,然后再根据order by 进行排序“连续”统计。 四.一个实际的例子来说明over()分析函数在代码上能简化和提高效率。 question: 查询出管理员工人数最多的人的名字和他管理的人的名字 answer: 1.普通的方法: select d.ename 管理员工人数最多的人的名字, o.ename 他管理的人的名字 from emp d, emp o where o.empno = d.mgr and d.empno in (select p.empno from emp p where p.empno in (select r.mgr from (select e.mgr, count(e.mgr) c from emp e group by e.mgr) r where r.c is (select max(w.z) from (select count(m.mgr) z from emp m group by m.mgr) w))) 2.使用over()分析函数: select e.ename 管理员工人数最多的人的名字, j.ename 他管理的人的名字 from emp e, emp j where j.empno = e.mgr and e.empno in (select distinct (r.mgr) from (select m.mgr, count(m.mgr) over(partition by m.mgr order by m.empno) t from emp m) r where r.t is (select max(y.h) from (select count(p.mgr) over(partition by p.mgr order by p.empno) h from emp p) y)) 输出结果是一样的:
声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
返回顶楼 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
发表时间:2010-02-09
select t.empno,t.ename,sum(t.sal) from emp t group by t.empno,t.ename
和 select t.empno,t.ename,sum(t.sal)over() sum from emp t 的结果是一样的吗? |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
返回顶楼 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
发表时间:2010-02-10
不错,以前还以为用了分组函数就不能查其它字段了
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
返回顶楼 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
发表时间:2010-02-10
开窗函数只是在你想查询的结果中多出一列,与分组还是有很大区别的
它可以完成分组方式不能完成的一些任务。 table:id,name,money,month;一个id对应一个month一条数据 A: select month,id , name , sum(money) over(partition by id ) from stuff ; B: select id , name , sum(money) from struff group id,name; 以上两种方法的结果是不一样的 A:结果是每个月都有一条数据。 B:如果要想把月查询出来就比较难了。 |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
返回顶楼 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
发表时间:2010-02-10
当然,over()这个函数还可与很多开窗函数一起使用;如
row_number() max() sum() lead() ...... 各个函数的使用情况也各不一样。 有了这些函数日常工作中非常有用. |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
返回顶楼 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
发表时间:2010-02-20
java_fxj 写道 select t.empno,t.ename,sum(t.sal) from emp t group by t.empno,t.ename
和 select t.empno,t.ename,sum(t.sal)over() sum from emp t 的结果是一样的吗? 不一样啊。 group by之后你的sum(salary) 根本就没有起到sum的效果。 |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
返回顶楼 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
发表时间:2010-03-04
引用 select t.empno,t.ename,sum(t.sal) from emp t group by t.empno,t.ename
这样已经报ORA-00937:非单组分组函数; 引用 select t.empno,t.ename,sum(t.sal)over() from emp t
这样是能输出结果的,sum这一列的值是一样的都是sal的总和。 |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
返回顶楼 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
发表时间:2010-09-19
第一个用order by 不是更好吗?
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
返回顶楼 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
发表时间:2010-09-21
hezhou_0521 写道 第一个用order by 不是更好吗?
哪个第一个 |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
返回顶楼 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
发表时间:2010-11-09
感谢楼主分享!我在运行这些sql的时候,如果over()括号内没东西的话就报错,我用的是oracle10g的(但是在9i下确实可以的),错误代码如下:
SQL> select t.empno,t.ename,sum(t.sal)over() sum from emp t; select t.empno,t.ename,sum(t.sal)over() sum from emp t * 第 1 行出现错误: ORA-00600: 内部错误代码, 参数: [12410], [], [], [], [], [], [], [] SQL> 还请各位大侠看看为什么抱着个错啊! |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
返回顶楼 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||