学习步骤:
1. 拥有Oracle EBS demo 环境 或者 PROD 环境
2. copy以下代码进 PL/SQL
3. 配合解释分析结果
4. 如果网页有点乱请复制到TXT中查看

/*假设一个经理代表了一个部门
*/
SELECT emp.full_name,
       emp.salary,
       emp.manager_id,
       row_number() over(PARTITION BY emp.manager_id ORDER BY emp.salary DESC) row_number_dept, --部门排行
       rownum row_number, --行号
       round((rownum + 1) / 4) page_number, --每4行一页
       ntile(2) over(ORDER BY emp.salary DESC) page_number_nt, --平均分成两类
      
       AVG(emp.salary) over(PARTITION BY emp.manager_id) avg_salary_department, --该部门薪水均值
       SUM(emp.salary) over(PARTITION BY emp.manager_id) sum_salary_department, --该部门薪水总额
       COUNT(emp.salary) over(PARTITION BY emp.manager_id) count_emp_department, --部门所有的员工
       dense_rank() over(PARTITION BY emp.manager_id ORDER BY emp.salary DESC) rank_salary_dept, --该人员的部门薪水排行
       dense_rank() over(ORDER BY emp.salary DESC) rank_salary_company, --该人员的全公司排行
      
       MIN(emp.salary) over(PARTITION BY emp.manager_id) min_salary_dept, --部门的最低薪水      
 
     MIN(emp.salary) keep(dense_rank FIRST ORDER BY emp.salary)
over(PARTITION BY emp.manager_id) min_salary_dept_first, --部门的最低薪水
       first_value(emp.salary) over(PARTITION BY emp.manager_id ORDER BY emp.salary) min_salary_dept_firstv, --部门的最低薪水     
      
       MAX(emp.salary) over(PARTITION BY emp.manager_id) max_salary_dept, --部门的最高薪水
 
     MAX(emp.salary) keep(dense_rank LAST ORDER BY emp.salary)
over(PARTITION BY emp.manager_id) max_salary_dept_last, --部门的最高薪水
       last_value(emp.salary) over(PARTITION BY emp.manager_id ORDER BY emp.salary) max_salary_dept_lastv, --部门的最高薪水
      
       lag(emp.full_name, 1, '00') over(ORDER BY emp.salary DESC) last_persion, --薪水在自己前一位的人
       lead(emp.full_name, 1, '00') over(ORDER BY emp.salary DESC) next_persion --薪水在自己后一位的人
  FROM fwk_tbx_employees emp
ORDER BY emp.salary DESC
  
  1. 基本概念理解
  
     分析函数
        1. 顾名思义,分析函数是在主查询结果的基础上进行一定的分析,如分部门汇总,分部门求均值等等。
     
     数据窗口
        1. Oracle 分析函数建立在所谓的数据窗口之上,数据窗口可以理解为一个数据集合。主查询的数据可以按照不同的标准分割成不同的数据集。比如partition BY manager_id
     按照manager_id将主查询的数据分成N(N代表有多少个不同的Manager_id)个不同的数据窗口。
        2. 其次,数据窗口内部还应该与一定的顺序通过 ORDER BY 实现
     
     分析函数和GROUP BY的区别和联系
        1. 分析函数的功能大部分都可以通过GROUP BY 来聚合完成
        2. 分析函数查询出来的行数是由主查询决定的,GROUP BY 的行数结果是由GROUP BY 后面的集合构成的唯一性组合决定的,通常比主查询的结果行数少。
         
     
  2. 典型格式详解
     
     SUM(emp.salary) over(PARTITION BY emp.manager_id) sum_salary_department, --该部门薪水总额
   
   功能简介:
     当前行对应人员所在部门的薪水总额
     AVG,count与之类似
     
   过程理解
     1. 首先将查询出来的数据集按照MANAGER_ID分割
     2. 查找到当前行的MANAGER_ID对应的数据集
     3. 对以上数据集合求和,生成一个结果附在新添加的列中
     
         
     dense_rank() over(PARTITION BY emp.manager_id ORDER BY emp.salary DESC) rank_salary_dept, --该人员的部门薪水排行
     
   功能简介:
     当前行对应人员在所在部门的薪水排名(不出现并列情况,相同的值也会依次有不同的排序,且排序连续)
     RANK 函数与之相反,要出现并列的情况啊,且并列将导致排名不连续如A和B并列第一,那么将没有第二名,而直接出现第三名
   过程理解
     1. 首先将查询出来的数据集按照MANAGER_ID分割
     2. 对当前行MANAGER_ID对应的数据集进行排序
     3. 将本行对应的行号提取并附在附加列中
     
 
   MIN(emp.salary) keep(dense_rank FIRST ORDER BY emp.salary)
over(PARTITION BY emp.manager_id)  min_salary_dept_first, --部门的最低薪水
     
   功能简介:
     当前行对应人员在所在部门的最低薪水
     MAX函数与之类似
   过程理解
     1. 首先将查询出来的数据集按照MANAGER_ID分割
     2. 对当前行MANAGER_ID对应的数据集进行排序,提取最前面的行,最前面的行的值有相等的,那么返回多行
     3. 在返回的多行中,提取薪水最小的行,并提取salary字段
     
     first_value(emp.salary) over(PARTITION BY emp.manager_id ORDER BY emp.salary) min_salary_dept_firstv, --部门的最低薪水  
     
  功能简介:
     当前行对应人员在所在部门的最低薪水
     last_value与之相反,求的是最后一个值
   
   过程理解
     1. 首先将查询出来的数据集按照MANAGER_ID分割
     2. 对当前行MANAGER_ID对应的数据集进行排序
     3. 提取第一行的salary字段
     
     
   LAG(EMP.FULL_NAME, 1, '00') OVER (ORDER BY EMP.SALARY DESC)  LAST_PERSION, --薪水在自己前一位的人
     
   功能简介:
     总体薪水排名中,比自己高一位的人的名字
     lead 函数与之相反求的在自己后面的人
   
   参数介绍:
     LAG(p_segment, p_distance, p_defaualt_val)
     1. p_segment: 需要提取的字段
     2. p_distance:>=0的数,表示比当前人员前面了几位
     3. p_defaualt_val: 当当前行没有比它前的行的时候,显示默认值
   
   过程理解
     1. 首先将查询出来的数据集按照薪水进行降序排序
     2. 提取前p_distance位的p_segment字段

转载:http://www.cnblogs.com/benio/archive/2011/06/01/2066106.html

常用Oracle分析函数详解的更多相关文章

  1. 常用Oracle分析函数详解 [http://www.cnblogs.com/benio/archive/2011/06/01/2066106.html]

      学习步骤:1. 拥有Oracle EBS demo 环境 或者 PROD 环境2. copy以下代码进 PL/SQL3. 配合解释分析结果4. 如果网页有点乱请复制到TXT中查看 /*假设一个经理 ...

  2. oracle 数据类型详解---日期型(转载)

    oracle 数据类型详解---日期型 oracle数据类型看起来非常简单,但用起来会发现有许多知识点,本文是我对ORACLE日期数据类型的一些整理,都是开发入门资料,与大家分享: 注:由于INTER ...

  3. Oracle date 详解

    oracle 数据类型详解---日期型 oracle数据类型看起来非常简单,但用起来会发现有许多知识点,本文是我对ORACLE日期数据类型的一些整理,都是开发入门资料,与大家分享:注:由于INTERV ...

  4. 【第六课】Nginx常用配置下详解

    目录 Nginx常用配置下详解 1.Nginx虚拟主机 2.部署wordpress开源博客 3.部署discuz开源论坛 4.域名重定向 5.Nginx用户认证 6.Nginx访问日志配置 7.Ngi ...

  5. 【Oracle】详解ORACLE中的trigger(触发器)

    本篇主要内容如下: 8.1 触发器类型 8.1.1 DML触发器 8.1.2 替代触发器 8.1.3 系统触发器 8.2 创建触发器 8.2.1 触发器触发次序 8.2.2 创建DML触发器 8.2. ...

  6. JAVA通过JDBC连接Oracle数据库详解【转载】

    JAVA通过JDBC连接Oracle数据库详解 (2011-03-15 00:10:03) 转载▼http://blog.sina.com.cn/s/blog_61da86dd0100q27w.htm ...

  7. 问题:Oracle出发器;结果:1、Oracle触发器详解,2、Oracle触发器示例

    ORACLE触发器详解 本篇主要内容如下: 8.1 触发器类型 8.1.1 DML触发器 8.1.2 替代触发器 8.1.3 系统触发器 8.2 创建触发器 8.2.1 触发器触发次序 8.2.2 创 ...

  8. [转帖]【Oracle】详解Oracle中NLS_LANG变量的使用

    [Oracle]详解Oracle中NLS_LANG变量的使用 https://www.cnblogs.com/HDK2016/p/6880560.html NLS_LANG=LANGUAGE_TERR ...

  9. oracle 序列 详解

    序列: 是oacle提供的用于产生一系列唯一数字的数据库对象. l  自动提供唯一的数值 l  共享对象 l  主要用于提供主键值 l  将序列值装入内存可以提高访问效率 创建序列: 1.  要有创建 ...

随机推荐

  1. 简介web服务器的工作原理

    一 什么是web服务器,应用服务器和web容器? 对于web服务器与应用服务器:“在过去它们是有区别的,但是这两个不同的分类慢慢地合并了,而如今在大多在情况下和使用中可以把它们看成一个整体.” 但是当 ...

  2. html div + css 下划线

    这里通过边框属性的虚线边框border控制虚线.以下设置的css 高度(css height)和css 宽度(css width)为350像素是为了便于观看演示 其它意思.一.四边为虚线边框borde ...

  3. dr03_

    1.温州配调-->全网-->厂站-->瓯海-->竹溪变 1.1.“10kVI段”,“60号间隔”,手车开关 --> 合上 2. 2.1. 2.2. TdrSvgDll.A ...

  4. ubuntu环境下安装Redis

    1.命令行安装 sudo apt-get update sudo apt-get install redis-server 2.启动redis $redis-server :C Aug ::42.26 ...

  5. dp1--乘积最大

    dp1--乘积最大 一.心得 1.用excel填数组很方便 2. dp就是填表 找状态就是缩小规模 找状态转移方程就是 找状态的最后一次关系 二.题目 8782:乘积最大 查看 提交 统计 提问 总时 ...

  6. iostream,iostream.h差异

    1. 不加.h的是现在C++中规定的标准,目的在于使C++代码用于移植和混合嵌入时不受扩展名.h的限制, 避免因为.h而造成的额外的处理和修改而加.h的是c语言的用法,但是在c++中也支持这种用法, ...

  7. Mybatis 接口方式对数据的增删改查 一对一关联查询

    数据库中有两个表 student 和studentInfo student表中的字段和数据 studentInfo表中的字段 ok数据库说完了,开始建立一个项目,对数据库中的数据进行操作吧 新建jav ...

  8. (转)关于Linux核心转储文件 core dump

    所谓核心转储文件是内含进程终止时内存映像的一个文件.产生条件:特定的信号会引发进程创建一个核心转储文件并终止运行. 包括哪些特定信号,请参见http://man7.org/linux/man-page ...

  9. RESTful 组件

    1. CBV FBV: url("index/",index) # index(request) url("index/(\d+)",index) # inde ...

  10. POJ - 2891 Strange Way to Express Integers (扩展中国剩余定理)

    题目链接 扩展CRT模板题,原理及证明见传送门(引用) #include<cstdio> #include<algorithm> using namespace std; ty ...