Oracle分析函数(一)
(一)分析函数语法
function_name(<argument>,<argument>...) over(<partition by clause><order by clause> <windowing_clause>);
function_name:函数名称,如count(),sum(),avg(),max(),min()等
argument : 参数
over() : 开窗函数
partition_clause:分区(分组)子句
order by clause:排序字句,数据记录排序,累计计算
windowing clause:开窗子句,定义分析函数在操作行的集合。分析函数有三种:rows、range、specifying。
(二)分析函数使用汇总
(2.1)count() over():统计分区各组中的行数,partition by可选,order by可选。
例子1:统计总人数
SQL> SELECT ename,job,COUNT(*) OVER() FROM emp; --总计数
例子2:按照sal排序,统计总人数
SELECT ename,job,sal,COUNT(*) OVER(ORDER BY sal) FROM emp; --按照薪资递加计数
例子3:统计各个部门的总人数
SELECT ename,job,sal,deptno,COUNT(*) OVER(PARTITION BY deptno) FROM emp; --分组计数,统计各个部门的人数
例子4:对部门分组,对各个部门按照薪资排序并计数
SELECT ename,job,deptno,sal,COUNT(*) OVER(PARTITION BY deptno ORDER BY sal) FROM emp; --按照各个部门的薪资水平排序
(2.2)sum() over():记录分区中的总和,partition by可选,order by可选
例子1:求出所有部门的薪资总和
SELECT ename,job,sal,hiredate,SUM(sal) OVER() FROM emp;
例子2:求出各个部门薪资的累计值,按部门累计
SELECT ename,job,sal,hiredate,SUM(sal) OVER(ORDER BY deptno) FROM emp;
例子3:求出各自部门薪资的总和
SELECT ename,job,deptno,sal,hiredate,SUM(sal) OVER(PARTITION BY deptno) FROM emp
例子4:求出各部门薪资累计值
SELECT ename,job,deptno,sal,hiredate,SUM(sal) OVER(PARTITION BY deptno ORDER BY sal) FROM emp;
(2.3)avg() over():记录分区中的平均值,partition by可选,order by可选
例子1:求出所有人的平均薪资
SELECT ename,sal,hiredate,AVG(sal) OVER() FROM emp;
例子2:求出部门的累计薪资。
SELECT ename,deptno,sal,hiredate,AVG(sal) OVER(ORDER BY deptno) FROM emp;
图中红色代表10号部门人员的平均薪资,
蓝色代表10号部门与20号部门人员的平均薪资,
紫色代表10号部门与20号部门与30号部门人员的平均薪资。
例子3.求出各个部门的平均薪资
SELECT ename,deptno,sal,hiredate,AVG(sal) OVER(PARTITION BY deptno) FROM emp;
例子4:求出各个部门的平均累计薪资
SELECT ename,deptno,sal,hiredate,AVG(sal) OVER(PARTITION BY deptno ORDER BY sal) FROM emp;
(2.4)min() avg():统计分组中的最小值,partition by可选,order by可选
例子1:求所有人中薪资最小值
SELECT ename,sal,hiredate,MIN(sal) OVER() FROM emp;
例子2:求出按部门累计的最小薪资
SELECT ename,deptno,sal,hiredate,MIN(sal) OVER(ORDER BY deptno) FROM emp;
图中红圈是10号部门的最低薪资,蓝圈是10号部门与20号部门的最低薪资,紫圈是10号部门、20号部门、30号部门的最低薪资。
例子3:求出各个部门的最低薪资
SELECT ename,deptno,sal,hiredate,MIN(sal) OVER(PARTITION BY deptno) FROM emp;
例子4:按照部门求出各自部门的最小薪资,并按照部门分组后再按照薪资排序
SELECT ename,deptno,sal,hiredate,MIN(sal) OVER(PARTITION BY deptno ORDER BY sal) FROM emp;
(2.5)max() avg():统计分组中的最大值,partition by可选,order by可选。用法与上面的min() over()相似。
(2.6)row_number() over():排序,排序序号无重复值,partition by可选,order by必选
例子1:按照薪资水平从高到低输出所有人的信息
SELECT ename,deptno,sal,hiredate,row_number() OVER(ORDER BY sal DESC) FROM emp;
例子2:先按部门分组,再按照薪资水平从高到低输出所有人的信息
SELECT ename,deptno,sal,hiredate,row_number() OVER(PARTITION BY deptno ORDER BY sal DESC) FROM emp;
例子2.1:求出各个部门前2名薪资最高的人员信息
SELECT *
FROM (SELECT ENAME,
DEPTNO,
SAL,
HIREDATE,
ROW_NUMBER() OVER(PARTITION BY DEPTNO ORDER BY SAL DESC) RN
FROM EMP)
WHERE RN < 3;
(2.7)rank() over():跳跃排序,排序序号会有重复,partition by可选,order by必选
例子1:先按照部门降序,再按照薪资降序排序
SELECT ename,deptno,sal,hiredate,RANK() OVER(ORDER BY deptno DESC,sal DESC) FROM emp;
例子2:先按照部门分区(分组),再按照薪资升序排序
SELECT ename,deptno,sal,hiredate,RANK() OVER(PARTITION BY deptno ORDER BY sal) FROM emp;
(2.8)dense_rank() over():连续排序,排序序号会有重复,partition by可选,order by必选
例子1:先按部门排序,再只能找工资排序
SELECT ename,deptno,sal,hiredate,dense_rank() OVER(ORDER BY deptno DESC,sal DESC) FROM emp;
例子2:先按照部门分组,再按照薪资排序
SELECT ename,deptno,sal,hiredate,dense_rank() OVER(PARTITION BY deptno ORDER BY sal) FROM emp;
(2.9)ntile(n) over():将记录平均分成n份,多出的按照次序分给前面的组。partition by可选,order by必选。
例子1:将emp表信息按照薪资从低到高分成4份
例子2:先按照部门分组,再将每个部门的数据按照薪资从低到高分成4份。
SELECT ename,deptno,sal,hiredate,NTILE(4) OVER(PARTITION BY deptno ORDER BY sal) FROM emp;
(2.10)first_value() over():取出分区中第一条记录字段的值。partition by可选 ,order by可选。
last_value() over() :取出分区中最后一条记录字段的值。partition by可选,order by可选。
(2.11)lag() over():取出前n行数据,加到当前行作为一个新的列。partition by可选,order by必选。
语法为:lag(field,num,defaultValue) field为要查找的字段,num代表往前查找num行的数据,defaultValue代表没有符合条件的默认值。通过该函数可以去除前n行的数据放入到当前行的新列中。
例子1:将前一个用户的薪资作为新的列forward_sal加入到当前用户信息中。
SELECT ename,deptno,sal,hiredate,LAG(sal,1,0) OVER(ORDER BY sal) forward_sal FROM emp;
例子2:按照部门分组,再将前一个用户的薪资作为新的列forward_sal加入到当前用户信息中
SELECT ename,deptno,sal,hiredate,LAG(sal,1,0) OVER(PARTITION BY deptno ORDER BY sal) forward_sal FROM emp;
(2.12)lead() over():取出后n行数据,加到当前行作为一个新的列。partition by可选,order by必选。
例子1:按照sal从小到大排序,取出后一行的sal数据添加到当前行,作为一个新的列
SELECT ename,deptno,sal,hiredate,LEAD(sal,1,0) OVER(ORDER BY sal) FROM emp;
【完】
Oracle分析函数(一)的更多相关文章
- Oracle分析函数入门
一.Oracle分析函数入门 分析函数是什么?分析函数是Oracle专门用于解决复杂报表统计需求的功能强大的函数,它可以在数据中进行分组然后计算基于组的某种统计值,并且每一组的每一行都可以返回一个统计 ...
- [转]oracle分析函数Rank, Dense_rank, row_number
oracle分析函数Rank, Dense_rank, row_number 分析函数2(Rank, Dense_rank, row_number) 目录 ==================== ...
- [转]oracle 分析函数over
oracle 分析函数over 分析函数(OVER) 目录: =============================================== 1.Oracle分析函数简介 2. O ...
- oracle分析函数与over()(转)
文章参考:http://blog.csdn.net/haiross/article/details/15336313 -- Oracle分析函数入门-- 分析函数是什么? 分析函数是Oracle专门用 ...
- Oracle分析函数 — rank, dense_rank, row_number用法
本文通过例子演示了Oracle分析函数 —— rank, dense_rank, row_number的用法. //首先建score表 create table score( course nva ...
- 常用Oracle分析函数详解 [http://www.cnblogs.com/benio/archive/2011/06/01/2066106.html]
学习步骤:1. 拥有Oracle EBS demo 环境 或者 PROD 环境2. copy以下代码进 PL/SQL3. 配合解释分析结果4. 如果网页有点乱请复制到TXT中查看 /*假设一个经理 ...
- oracle分析函数技术详解(配上开窗函数over())
一.Oracle分析函数入门 分析函数是什么?分析函数是Oracle专门用于解决复杂报表统计需求的功能强大的函数,它可以在数据中进行分组然后计算基于组的某种统计值,并且每一组的每一行都可以返回一个统计 ...
- Oracle分析函数——函数列表
--------------聚合函数 SUM :该函数计算组中表达式的累积和 MIN :在一个组中的数据窗口中查找表达式的最小值 MAX :在一个组中的数据窗口中查找表达式的最大值 AVG :用于计算 ...
- 强大的oracle分析函数
转载:https://www.cnblogs.com/benio/archive/2011/06/01/2066106.html 学习步骤:1. 拥有Oracle EBS demo 环境 或者 PRO ...
- Oracle分析函数大全
分析函数又叫开窗函数,OLAP函数等,因为有人问我用过开窗函数没,呵,什么是开窗函数,从来没听过,难道是分析函数么.哈哈,最后还真是分析函数哦!用过的东西别名也应该知道,赶上这么个事,就剽窃一眼Ora ...
随机推荐
- Portal for ArcGIS 10.2.2更改域名和导入自定义证书
1.产品版本 Portal for ArcGIS10.2.2(同样适用于ArcGIS10.3) 2.修改说明 )修改Portal中的域名:(2)修改Portal中的证书. 3.修改步骤 3.1.在ho ...
- iOS友盟分享的使用总结
现在几乎所有的APP都会集成分享,为了可以更好的推广自己的APP. 目前市面上常用的分享无非就三个: 1.友盟分享; 2.shareSDK(mob); 3.苹果原生. 由于苹果原生的分享使用起来不方便 ...
- CSS中的line-height
基本概念 行高.行距 行高是指文本行基线间的垂直距离.那什么是基线呢?记不记得vertical-align属性有个baseline值,这个baseline就是基线. 注意:倒数第二根才是基线(base ...
- java笔记--增加虚拟机内存
--如果朋友您想转载本文章请注明转载地址"http://www.cnblogs.com/XHJT/p/3877243.html "谢谢-- 为避免大型应用程序因虚拟机内存不足而无法 ...
- Sql Server增加Sequence序列语句
1.创建序列 下面的示例创建名为 DecSeq 使用一个序列 十进制 具有介于 0 到 255 之间的数据类型.序列以 125 开始,每次生成数字时递增 25. 因为该序列配置为可循环,所以,当值超过 ...
- 【 PostgreSQL】十条实用数据库SQL优化建议
基于PostgreSQL,总结几条常用的查询操作的优化建议,部分也适用于Oracle等数据库. 1.选择合适的分布键 分布键选择不当会导致重分布.数据分布不均等,而数据分布不均会使SQL集中在一个se ...
- Hadoop配置文件详解
1 获取默认配置 配置hadoop,主要是配置core-site.xml,hdfs-site.xml,mapred-site.xml三个配置文件,默认下来,这些配置文件都是空的,所以很难知 ...
- 修改UIView的backedlayer为CAShapeLayer
修改UIView的backedlayer为CAShapeLayer 什么叫backedlayer呢?backedlayer指的是一个View在创建好的时候就已经帮你创建好了一个与View大小一致的CA ...
- 网站url常见报错
报错情况比较复杂,此处列出比较常见的几种报错内容: 报错: 报错是一个大类, 的报错基本上是权限问题,出现 报错时您需要检测权限配置问题. 403.1 错误是由于“执行”访问被禁止而造成的.若试图从目 ...
- Linux基础和常用命令
经常使用的命令: #查看端口被占用情况 netstat -tunlp|grep #查看java进程 ps -ef|grep java #压缩前端工程 rar a -ep1 ./update/win32 ...