`
郑云飞
  • 浏览: 809002 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

oracle over()函数

 
阅读更多
准备工作: 
table:oracle用户scott下的emp表 ; 

一. 
Oracle 从8.1.6开始提供分析函数,分析函数用于计算基于组的某种聚合值,它和聚合函数的不同之处是 

  对于每个组返回多行,而聚合函数对于每个组只返回一行。 

exp: 

Sql代码  
1.select t.empno,t.ename,sum(t.sal) from emp t  
select t.empno,t.ename,sum(t.sal) from emp t
这样会报:ORA-00937:非单组分组函数; 
结论:聚合函数只能返回1行值。 

Sql代码  
1.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
返回的结果: 
empno ename sum 
7369 SMITH 142781.99 
7499 ALLEN 142781.99 
7521 WARD 142781.99 
7566 JONES 142781.99 
7654 MARTIN 142781.99 
7698 BLAKE 142781.99 
7782 CLARK 142781.99 
7788 SCOTT 142781.99 
7839 KING 142781.99 
7844 TURNER 142781.99 
7876 ADAMS 142781.99 
7900 JAMES 142781.99 
7902 FORD 142781.99 
7934 MILLER 142781.99 

结论:这就是每个组返回多行。 

二. 
over()、over(order by...)与over(partition by...)之间的区别 
1.分析函数over()用在聚合函数(max(),sun()....)后面,可返回多行所有结果的聚合值; 
exp:如上; 

2.over(order by...)用在聚合函数(max(),sun()....)后面,可返回根据排序结果进行统计到当前行的聚合值(即“连续”统计); 
exp:
Sql代码  
1.select t.empno,   
2.       t.deptno,   
3.       t.ename,   
4.       t.sal,   
5.       sum(t.sal) over(order by t.ename) sum  
6.  from emp t  
select t.empno,
       t.deptno,
       t.ename,
       t.sal,
       sum(t.sal) over(order by t.ename) sum
  from emp t
返回的结果: 
empno  deptno  ename      sal        sum 
7876 20 ADAMS 4646.11 4646.11 
7499 30 ALLEN 8493.66  13139.77 
7698 30 BLAKE 15047.69  28187.46 
7782 10 CLARK 11823.85  40011.31 
7902 20 FORD 14935.97 54947.28 
7900 30 JAMES 4935.36  59882.64 
7566 20 JONES 15086.30  74968.94 
7839 10 KING 23841.13  98810.07 
7654 30 MARTIN 6526.80  105336.87 
7934 10 MILLER 6167.32  111504.19 
7788 20 SCOTT 12710.16  124214.35 
7369 20 SMITH 4089.17  128303.52 
7844 30 TURNER 7843.77  136147.29 
7521 30 WARD 6634.70  142781.99 

分析:第二行的sum=第一行里的sal+第二行里的sal; 
      第二行的sum=第一行里的sal+第二行里的sal+第三行里的sal; 
      ..... 
结论:返回值是根据排序后的结果,当前所在的行进行统计的。 

3.over(partition by...)用在聚合函数(max(),sun()....)后面,可根据pratition by里指定的某一列来统计聚合值。 
exp:
Sql代码  
1.select t.empno,   
2.       t.deptno,   
3.       t.ename,   
4.       t.sal,   
5.       sum(t.sal) over(partition by t.deptno) sum  
6.  from emp t  
select t.empno,
       t.deptno,
       t.ename,
       t.sal,
       sum(t.sal) over(partition by t.deptno) sum
  from emp t

返回的结果: 
empno deptno    ename      sal        sum 
7782  10 CLARK 11823.85  41832.3 
7839  10 KING 23841.13  41832.3 
7934 10 MILLER 6167.32 41832.3 
7369 20 SMITH 4089.17 51467.71 
7876 20 ADAMS 4646.11 51467.71 
7902 20 FORD 14935.97 51467.71 
7788 20 SCOTT 12710.16 51467.71 
7566 20 JONES 15086.30 51467.71 
7499 30 ALLEN 8493.66 49481.98 
7698 30  BLAKE 15047.69  49481.98 
7654  30 MARTIN  6526.80  49481.98 
7900 30  JAMES 4935.36 49481.98 
7844  30 TURNER 7843.77 49481.98 
7521  30 WARD 6634.70 49481.98 

分析:每个sum的值都是把deptno相同的sal值进行求和。 
结论:根据pratition by里指定的某一列来统计聚合值。 

三.一个综合的例子: 
exp: 
question: 
按部门“连续”求总和; 
answer: 

Sql代码  
1.select t.empno,   
2.       t.deptno,   
3.       t.ename,   
4.       t.sal,   
5.       sum(t.sal) over(partition by t.deptno order by t.ename) sum  
6.  from emp t  
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

返回的结果: 
empno deptno    ename      sal        sum 
7782 10 CLARK 11823.85 11823.85 
7839 10 KING 23841.13 35664.98 
7934 10 MILLER 6167.32  41832.3 
7876 20 ADAMS 4646.11  4646.11 
7902 20 FORD 14935.97  19582.08 
7566 20 JONES 15086.30 34668.38 
7788 20 SCOTT 12710.16  47378.54 
7369 20 SMITH 4089.17 51467.71 
7499 30 ALLEN 8493.66 8493.66 
7698 30 BLAKE 15047.69 23541.35 
7900 30 JAMES 4935.36  28476.71 
7654 30 MARTIN 6526.80 35003.51 
7844 30 TURNER 7843.77 42847.28 
7521 30 WARD 6634.70  49481.98 

分析:先根据partition by 进行分组,然后再根据order by 进行排序“连续”统计。 

四.一个实际的例子来说明over()分析函数在代码上能简化和提高效率。 
question: 
         查询出管理员工人数最多的人的名字和他管理的人的名字 
answer: 
1.普通的方法: 

Sql代码  
1.select d.ename 管理员工人数最多的人的名字, o.ename 他管理的人的名字   
2.  from emp d, emp o   
3. where o.empno = d.mgr   
4.   and d.empno in  
5.       (select p.empno   
6.          from emp p   
7.         where p.empno in  
8.               (select r.mgr   
9.                  from (select e.mgr, count(e.mgr) c from emp e group by e.mgr) r   
10.                 where r.c is  
11.                       (select max(w.z)   
12.                          from (select count(m.mgr) z from emp m group by m.mgr) w)))  
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()分析函数: 

Sql代码  
1.select e.ename 管理员工人数最多的人的名字, j.ename 他管理的人的名字   
2.  from emp e, emp j   
3. where j.empno = e.mgr   
4.   and e.empno in (select distinct (r.mgr)   
5.                     from (select m.mgr,   
6.                                  count(m.mgr) over(partition by m.mgr order by m.empno) t   
7.                             from emp m) r   
8.                    where r.t is (select max(y.h)   
9.                               from (select count(p.mgr) over(partition by p.mgr order by p.empno) h   
10.                                            from emp p) y))  
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))


输出结果是一样的: 
管理员工人数最多的人的名字 他管理的人的名字 
BLAKE KING 


 

分享到:
评论

相关推荐

    ORACLE的OVER函数使用技巧

    ORACLE的OVER函数使用技巧ORACLE的OVER函数使用技巧ORACLE的OVER函数使用技巧

    ORACLE_OVER函数

    在Oracle数据库中,OVER函数是用于实现窗口函数(Window Functions)的重要组成部分。窗口函数允许我们执行更复杂的数据分析操作,如计算累计总和、排名等。这在开发报表时非常有用,能够让我们在查询结果中直接进行...

    Oracle开发的over函数

    ### Oracle开发中的OVER函数详解 #### 一、Oracle分析函数简介 在Oracle数据库开发中,分析函数是一类非常强大的工具,主要用于实现复杂的查询需求,尤其是在处理大量数据时,能够提供高级的数据汇总、排序和筛选...

    oracle分析函数over_及开窗函数.txt

    ### Oracle分析函数OVER及开窗函数详解 #### 一、概述 在Oracle数据库中,分析函数(Analytic Functions)是一种非常强大的工具,用于处理复杂的查询需求。这些函数可以在一组相关的行上执行计算,并且每行返回一个...

    ORACLE分析函数

    根据提供的文件信息,我们可以深入探讨Oracle分析函数的相关知识点,特别是`SUM()`函数配合`OVER`子句的不同用法,以及`RANK()`, `DENSE_RANK()`, 和 `ROW_NUMBER()` 这三个窗口函数的应用场景。 ### Oracle分析...

    oracle分析函数文档

    ### Oracle分析函数详解 #### 一、概述 Oracle分析函数是一种强大的工具,它允许用户对分组数据执行复杂的计算,并且结果可以根据特定条件进行动态调整。这种灵活性使得Oracle分析函数在处理复杂的数据集时非常...

    oracle分析函数.doc

    Oracle分析函数是数据库管理系统Oracle中一组强大的工具,用于处理集合数据,特别是在复杂的报表和数据分析场景中。它们允许用户在单个SQL查询中执行聚合操作,同时保持行的原始顺序,这是传统的GROUP BY函数无法...

    oracle分析函数,窗口函数,报表函数

    Oracle 分析函数、窗口函数和报表函数是数据库查询和数据分析中的关键工具,尤其在复杂的OLAP(在线分析处理)系统中发挥着重要作用。在Oracle数据库中,这些功能提供了对大量数据进行高效处理的能力,帮助用户生成...

    Oracle百分比分析函数RATIO_TO_REPORT() OVER()实例详解

    总结来说,Oracle的RATIO_TO_REPORT()函数提供了计算数据占比的能力,而OVER()子句则允许我们灵活地指定计算范围。在实际业务场景中,这个功能可以帮助我们进行深入的数据分析,发现隐藏的模式和趋势,进而优化业务...

    Oracle分析函数

    Oracle 分析函数详解 Oracle 分析函数是 Oracle 数据库中的一种强大功能,能够帮助用户快速进行数据分析和处理。在本文中,我们将对 Oracle 分析函数进行详细的介绍,并对其各个函数进行解释。 一、总体介绍 ...

    ORACLE分析函数大全

    Oracle分析函数是数据库管理系统Oracle中的一个强大特性,它允许用户在SQL查询中执行复杂的分析操作。分析函数在处理报表和数据迁移任务时尤其有用,因为它们可以基于分组计算聚合值,并为每个分组返回多行,而不...

    oracle分析函数(用法+实例)

    Oracle 分析函数(用法+实例) Oracle 分析函数是 Oracle 8.1.6 版本中引入的高级应用,属于 Oracle 的一大亮点。分析函数可以分为四大类:排名函数、聚合函数、行比较函数和统计函数。下面将对分析函数的原理、...

    ORACLE 分析函数大全

    Oracle 分析函数是一种强大的SQL工具,它允许你在处理数据时执行复杂的分析操作,而不像聚合函数那样仅仅返回单行结果。分析函数在Oracle 8.1.6版本中被引入,自那时起,它们已经成为数据库查询和报表生成的重要组成...

    Oracle分析函数教程

    Oracle分析函数是数据库管理系统Oracle中的一个重要特性,自8.1.6版本开始引入,它们用于执行基于组的聚合计算,并且为每个组返回多行结果,而不仅仅是单行。这使得分析函数在数据分析和报表生成方面非常有用,能够...

    oracle分析函数大全

    ### Oracle分析函数详解 #### 一、概述 Oracle分析函数是一种强大的工具,它自Oracle 8.1.6版本开始引入,并在后续版本中不断完善和发展。这类函数的主要用途在于能够针对一组数据执行复杂的聚合计算,并且不同于...

    Oracle中的分析函数详解

    其中,Oracle的分析函数是其强大的特性之一,它允许用户在单个SQL查询中执行复杂的分析操作,而无需使用子查询或者自连接。这篇文档将深入探讨Oracle中的分析函数,帮助你更好地理解和利用这一功能。 一、什么是...

    oracle分析函数及开窗函数

    ### Oracle分析函数及开窗函数详解 #### 一、Oracle分析函数概述 Oracle自8.1.6版本开始引入了分析函数,这类函数主要用于计算基于组的聚合值,并且与传统的聚合函数不同的是,分析函数可以针对每个组返回多行结果...

    ORACLE分析函数.pdf

    Oracle分析函数是数据库管理系统Oracle中的一种高级SQL特性,它允许用户在单个查询中对一组行进行计算,而无需使用子查询或自连接。这些函数极大地增强了数据分析和报告的能力,提高了查询性能。以下是对Oracle分析...

    oracle 常用函数下载

    Oracle数据库中的常用函数是数据库管理员和开发人员在处理数据时不可或缺的工具。这些函数极大地提高了数据处理的效率和灵活性。以下是一些常见的Oracle分析函数及其用法: 1. **开窗函数(Over)**: 开窗函数允许...

Global site tag (gtag.js) - Google Analytics