常用Oracle分析函数详解
学习步骤:
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分析函数详解的更多相关文章
- 常用Oracle分析函数详解 [http://www.cnblogs.com/benio/archive/2011/06/01/2066106.html]
学习步骤:1. 拥有Oracle EBS demo 环境 或者 PROD 环境2. copy以下代码进 PL/SQL3. 配合解释分析结果4. 如果网页有点乱请复制到TXT中查看 /*假设一个经理 ...
- oracle 数据类型详解---日期型(转载)
oracle 数据类型详解---日期型 oracle数据类型看起来非常简单,但用起来会发现有许多知识点,本文是我对ORACLE日期数据类型的一些整理,都是开发入门资料,与大家分享: 注:由于INTER ...
- Oracle date 详解
oracle 数据类型详解---日期型 oracle数据类型看起来非常简单,但用起来会发现有许多知识点,本文是我对ORACLE日期数据类型的一些整理,都是开发入门资料,与大家分享:注:由于INTERV ...
- 【第六课】Nginx常用配置下详解
目录 Nginx常用配置下详解 1.Nginx虚拟主机 2.部署wordpress开源博客 3.部署discuz开源论坛 4.域名重定向 5.Nginx用户认证 6.Nginx访问日志配置 7.Ngi ...
- 【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. ...
- JAVA通过JDBC连接Oracle数据库详解【转载】
JAVA通过JDBC连接Oracle数据库详解 (2011-03-15 00:10:03) 转载▼http://blog.sina.com.cn/s/blog_61da86dd0100q27w.htm ...
- 问题: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 创 ...
- [转帖]【Oracle】详解Oracle中NLS_LANG变量的使用
[Oracle]详解Oracle中NLS_LANG变量的使用 https://www.cnblogs.com/HDK2016/p/6880560.html NLS_LANG=LANGUAGE_TERR ...
- oracle 序列 详解
序列: 是oacle提供的用于产生一系列唯一数字的数据库对象. l 自动提供唯一的数值 l 共享对象 l 主要用于提供主键值 l 将序列值装入内存可以提高访问效率 创建序列: 1. 要有创建 ...
随机推荐
- java assert的使用并深入解析Java的assertion
java assert的使用并深入解析Java的assertion 分类: java2012-12-05 13:32 2020人阅读 评论(0) 收藏 举报 原文出处:http://blog.csdn ...
- SQL SERVER 日志已满的处理方法 (转)
事务日志文件Transaction Log File是用来记录数据库更新情况的文件,扩展名为ldf.在 SQL Server 7.0 和 SQL Server 2000 中,如果设置了自动增长功能,事 ...
- Educational Codeforces Round 15 A, B , C 暴力 , map , 二分
A. Maximum Increase time limit per test 1 second memory limit per test 256 megabytes input standard ...
- Android框架之路——GreenDao3.2.2的使用
一.简介 GreenDAO是一个开源的安卓ORM框架,能够使SQLite数据库的开发再次变得有趣.它减轻开发人员处理低级数据库需求,同时节省开发时间. SQLite是一个令人敬畏的内嵌的关系数据库,编 ...
- tensorflow1.0中的改善
TensorFlow 1.0 重大功能及改善 XLA(实验版):初始版本的XLA,针对TensorFlow图(graph)的专用编译器,面向CPU和GPU. TensorFlow Debugger(t ...
- ScrollView垂直滚动控件
ScrollView垂直滚动控件 一.简介 二.方法 1)ScrollView垂直滚动控件使用方法 1.在layout布局文件的最外层建立一个ScrollView控件 2.在ScrollView控件中 ...
- dp3--codevs2598 编辑距离问题
dp3--codevs2598 编辑距离问题 一.心得 1.字符串相关问题dp的时候从0开始是个陷阱 二.题目 2598 编辑距离问题 时间限制: 1 s 空间限制: 128000 KB 题目等 ...
- 04-dotnetCore博客后台基本功能实现
今天继续上篇博客的内容,在上一篇的时候,已经基本实现了博客列表内容的显示,继续进行添加.编辑.删除等功能.添加和编辑界面共用一个界面,添加界面如图所示: 同样我这里使用的还是layui里面的表单内容, ...
- Binding RelativeSource
IsChecked="{Binding IsExpanded, Mode=TwoWay, RelativeSource={RelativeSource TemplatedParent}}&q ...
- 高性能Js-加载和执行
Js文件加载和执行 单线程 概念:浏览器使用单一线程处理UI渲染和js脚本执行(只触发一次) 问题:等待js文件下载.解析.执行,UI渲染和用户界面刷新被阻塞(异步方式解决) 关键:文件加载.文件执行 ...