摘自: http://www.poluoluo.com/jzxy/201004/81921.html

百度文库也记载了oracle中over()分析函数的用法

在泡坛子的时候中无意中发现了这个函数,才知道oracle分析函数是如此的强大,其中over() 函数的用法又尤为的特别,所以将自己的研究结果记录一下。

  个人理解:over() 函数 是对 分析函数的一种条件解释,直接点就是 给分析函数加条件吧。

  在网上看见比较常用的就是 与 sum()、rank() 函数使用。接下来就用分析下两种函数结合over的用法。

  以下测试使用的orace默认的 scott用户下的emp表数据。

  1.sum()结合over()

  Sql代码

  select a.empno as 员工编号

  ,a.ename as 员工姓名

  ,a.deptno as 部门编号

  ,a.sal as 薪酬

  ,sum(sal) over (partition by deptno) 按部门求薪酬总和

  from scott.emp a;

  此段sql 执行的结果为:

  员工编码 员工姓名  部门编号  薪酬  按部门求薪酬总和

  7934        MILLER      10         1300          8750

  7782        CLARK        10        2450         8750

  7839        KING           10        5000         8750

  7369        SMITH         20        800           10875

  7876        ADAMS       20        1100         10875

  7566        JONES         20       2975         10875

  7788        SCOTT         20       3000         10875

  7902        FORD           20       3000          10875

  7900       JAMES          30       950             9400

  7654       MARTIN        30       1250           9400

  7521       WARD            30      1250           9400

  7844       TURNER        30      1500           9400

  7499       ALLEN            30      1600          9400

  7698     BLAKE 30 2850 9400

  可以从结果上看到sum()函数对部门区分进行了求和统计。其中“partition by”官方点的说法叫做"分区",其实就是统计的范围条件。

  下面在给把上面的sql语句改造下 给 over() 函数加上 “order by sal” 会看到一个更过瘾的效果:

  Sql代码

  select a.empno as 员工编号

  ,a.ename as 员工姓名

  ,a.deptno as 部门编号

  ,a.sal as 薪酬

  ,sum(sal) over (partition by deptno) 按部门求薪酬总和

  ,sum(sal) over (partition by deptno order by sal) 按部门累计薪酬

  from scott.emp a;

  结果为:

   员工编码   员工姓名  部门编号  薪酬  按部门求薪酬总和  按部门累计薪酬

  7934           MILLER        10      1300               8750                  1300

  7782          CLARK          10       2450              8750                   3750

  7839          KING             10       5000               8750                  8750

  7369          SMITH          20        800                10875                 800

  7876           ADAMS        20       1100               10875                 1900

  7566          JONES         20        2975               10875                 4875

  7788          SCOTT         20        3000               10875               10875

  7902          FORD           20        3000               10875               10875

  7900         JAMES          30        950                  9400                   950

  7654          MARTIN       30        1250                9400                  3450

  7521         WARD           30        1250                9400                 3450

  7844         TURNER       30       1500                 9400                 4950

  7499          ALLEN         30        1600                9400                 6550

  7698         BLAKE          30        2850                9400                 9400

  从结果中可以看的 加了 “order by”后对 统计进行一个累加,这里个人理解为对统计范围规定了个统计顺利,一步一步的统计。

  注:此sql语句结尾处不要加“order by”,应为使用的分析函数的(partition by deptno order by sal)

  里已经有排序的语句了,如果再在句尾添加排序子句,一致倒罢了,不一致,结果就令人费解了。

  2.rank()结合over()

  rank函数是分级函数,这个函数必须与 over 函数使用,否则会报一个"缺少窗口函数的错"。我测试sql如下:

  Sql代码

  select a.empno as 员工编号,

  a.sal as 薪资,

  a.job as 岗位,

  rank() OVER(partition by a.job ORDER BY a.sal desc) as 岗位薪资等级

  from scott.emp a;

  查询结果为:

  员工编号 薪资 岗位 等级

  7902      3000 ANALYST 1

  7788      3000 ANALYST 1

  7934      1300 CLERK 1

  7876      1100 CLERK 2

  7900       950 CLERK 3

  7369 800 CLERK 4

  7566 2975 MANAGER 1

  7698 2850 MANAGER 2

  7782 2450 MANAGER 3

  7839 5000 PRESIDENT 1

  7499 1600 SALESMAN 1

  7844 1500 SALESMAN 2

  7654 1250 SALESMAN 3

  7521 1250 SALESMAN 3

oracle中over()分析函数的用法相关推荐

  1. Oracle中游标Cursor基本用法详解

    这篇文章主要介绍了Oracle中游标Cursor基本用法详解,还是比较全面的,具有一定参考价值,需要的朋友可以了解下. 查询 SELECT语句用于从数据库中查询数据,当在PL/SQL中使用SELECT ...

  2. Oracle中ROW_NUMBER() OVER()函数用法

    Oracle中ROW_NUMBER() OVER()函数用法 1. 说明:ROW_NUMBER() OVER() 函数的作用:分组排序 2. 原理: row_number() over() 函数,ov ...

  3. oracle中的merge into用法解析

    oracle中的merge into用法解析 merge into的形式 MERGE INTO [target-table] A USING [source-table sql] B ON([cond ...

  4. oracle中的to_number,Oracle中to_number()函数的用法

    to_number()函数是oracle中常用的类型转换函数之一,是将一些处理过的按一定格式编排过的字符串变回数值型的格式. 1.to_number()函数可以将char或varchar2类型的str ...

  5. Oracle中to_char()函数的用法

    Oracle中to_char()函数的用法 日期转换: to_char(date,'格式') select to_date('2005-01-01 ','yyyy-MM-dd') from dual; ...

  6. oracle to_char函数格式,oracle 中to_char函数的用法

    一.日期格式转换 to_char(date,'格式'); select to_date('2005-01-01 ','yyyy-MM-dd') from dual; select to_char(sy ...

  7. Oracle中add_months()函数的用法

    Oracle中add_months()函数的用法 查询当前时间n个月以前的时间: select add_months(sysdate,-n) from dual; 查询当前时间n个月之后的时间: se ...

  8. oracle中rollback用法,Oracle中SAVEPOINT和ROLLBACK用法

    savepoint是事务内部允许部分rollback的标志符.因为事务中对记录做了修改,我们可以在事务中创建savepoint来标识不同的点.如果遇到错误,就可以rollback到不同的点或直接回来事 ...

  9. oracle分类函数总结,oracle中分组排序函数用法

    项目开发中,我们有时会碰到需要分组排序来解决问题的情况,如:1.要求取出按field1分组后,并在每组中按照field2排序:2.亦或更加要求取出1中已经分组排序好的前多少行的数据 这里通过一张表的示 ...

最新文章

  1. NodeJs端口被占用的情况
  2. linux root------系统排错
  3. 24分钟学会用JMock进行单元测试
  4. EJB继承与Java继承不同
  5. opencv双目视觉标定、匹配和测量 (附代码)
  6. matlab样条插值如何用,三次样条插值matlab实现
  7. 特斯拉股价创新高 马斯克嘚瑟:股价真高 哈哈!
  8. Android 开发之ViewPage官方文档学习笔记
  9. Oracle零碎要点---多表联合查询,收集数据库基本资料
  10. 阵列信号处理——求根MUSIC算法(Root MUSIC)
  11. #C语言或C++中强大的图形库——easyx
  12. 三四五线城市商机无限,但创业更适合在一线城市
  13. 传奇私服服务器修改沙巴克时间,新手教程:如何修改沙巴克名称
  14. NI PXI-6221(16路模拟输入)校准小记
  15. 一个好的浏览器是多么重要,强烈推荐一个好用的浏览器.........
  16. -- 27、 查询出只有两门课程的全部学生的学号和姓名(不重点)(自己做出)
  17. uboot分析:uboot的启动过程分析
  18. MYSQL JDBC快速查询响应的方法,快速返回机制的实现
  19. DRAM BRANK
  20. Name or service not known, ping域名报错

热门文章

  1. 获取选中_【字节】如何实现选中复制的功能
  2. 时间序列的预处理之纯随机性检验
  3. java线程池执行器_Java线程池ThreadPoolExecutor的使用
  4. 【youcans 的 OpenCV 例程200篇】157. 霍夫变换直线检测
  5. Python 小白从零开始 PyQt5 项目实战(5)布局管理
  6. mysql如何查看表拥有的键_如何查看表或列的所有外键?
  7. 商城是用jsp还是php,建设网上购物网站使用JSP系统还是ASP系统
  8. c++矩阵连乘的动态规划算法并输出_你在Java中用过动态规划吗?
  9. python crm_Python CRM项目一
  10. 哈夫曼编码和带权路径计算