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

学习步骤:
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字段

强大的oracle分析函数的更多相关文章

  1. Oracle分析函数入门

    一.Oracle分析函数入门 分析函数是什么?分析函数是Oracle专门用于解决复杂报表统计需求的功能强大的函数,它可以在数据中进行分组然后计算基于组的某种统计值,并且每一组的每一行都可以返回一个统计 ...

  2. oracle分析函数与over()(转)

    文章参考:http://blog.csdn.net/haiross/article/details/15336313 -- Oracle分析函数入门-- 分析函数是什么? 分析函数是Oracle专门用 ...

  3. oracle分析函数技术详解(配上开窗函数over())

    一.Oracle分析函数入门 分析函数是什么?分析函数是Oracle专门用于解决复杂报表统计需求的功能强大的函数,它可以在数据中进行分组然后计算基于组的某种统计值,并且每一组的每一行都可以返回一个统计 ...

  4. Oracle分析函数——函数列表

    --------------聚合函数 SUM :该函数计算组中表达式的累积和 MIN :在一个组中的数据窗口中查找表达式的最小值 MAX :在一个组中的数据窗口中查找表达式的最大值 AVG :用于计算 ...

  5. Oracle分析函数大全

    分析函数又叫开窗函数,OLAP函数等,因为有人问我用过开窗函数没,呵,什么是开窗函数,从来没听过,难道是分析函数么.哈哈,最后还真是分析函数哦!用过的东西别名也应该知道,赶上这么个事,就剽窃一眼Ora ...

  6. Oracle分析函数巧妙使用

    在 Oracle中使用Sql必须弄懂分析函数 Oracle开发专题之:分析函数(OVER) 1 Oracle开发专题之:分析函数2(Rank, Dense_rank, row_number) 6 Or ...

  7. [转]oracle分析函数Rank, Dense_rank, row_number

    oracle分析函数Rank, Dense_rank, row_number 分析函数2(Rank, Dense_rank, row_number)   目录 ==================== ...

  8. [转]oracle 分析函数over

      oracle 分析函数over 分析函数(OVER) 目录: =============================================== 1.Oracle分析函数简介 2. O ...

  9. Oracle分析函数 — rank, dense_rank, row_number用法

    本文通过例子演示了Oracle分析函数 —— rank, dense_rank, row_number的用法. //首先建score表 create table score( course   nva ...

随机推荐

  1. JavaScript 运动(缓冲运动,多物体运动 ,多物体多值运动+回调机制)

    匀速运动   (当需要物体做匀速运动直接调用statMove函数) function startMove(dom,targetPosetion){ //dom : 运动对象,targetPositio ...

  2. JAVA IO流 InputStream流 Read方法

    read()首先我们来看这个没有参数的read方法,从(来源)输入流中(读取的内容)读取数据的下一个字节到(去处)java程序内部中,返回值为0到255的int类型的值,返回值为字符的ACSII值(如 ...

  3. VS2013 Winform程序打包部署 InstallShield2015LimitedEdition

    VS2013 Winform程序打包部署 VS2013默认是没有安装打包程序的,需要手动安装,我安装的是 InstallShield2015LimitedEdition. 1.点击解决方案,右键,选择 ...

  4. vue 动态循环出的多个select 不能重复选择相同的数据

    看图说话 HTML: JS:        1)  2) 3) 有更好的方法可以相互学习.

  5. sed常用操作命令

    sed是一个很好的文件处理工具,本身是一个管道命令,主要是以行为单位进行处理,可以将数据进行替换.删除.新增.选取等特定工作. 命令格式: sed [OPTION]... {script-only-i ...

  6. 前端小白第一次使用redux存取数据练习

    在学习了redux基本教程后,课程参考如下网址:https://www.redux.org.cn/docs/introduction/CoreConcepts.html,开始着手练习 1.首先编写一个 ...

  7. sourceforge.net安装网站程序数据库相关

    sourceforge.net安装网站程序数据库相关 我们应该知道sourceforge.net是可以安装网站(当做一个虚拟空间使用的) 但是在安装cms程序的时候那时的数据库地址再填写“localh ...

  8. softmax 损失函数求导过程

    前言:softmax中的求导包含矩阵与向量的求导关系,记录的目的是为了回顾. 下图为利用softmax对样本进行k分类的问题,其损失函数的表达式为结构风险,第二项是模型结构的正则化项. 首先,每个qu ...

  9. Python argparse用法

    import argparse import sys parser = argparse.ArgumentParser(description='this is for test.') parser. ...

  10. nginx添加ssl证书

    ssl的证书是通过docker nginx letsencrypt 这篇随笔生成的,下面介绍如何在nginx中添加ssl 这个为全部配置, 需要替换你自己的域名,配置中强制https了 server ...