(一)分析函数语法

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分析函数(一)的更多相关文章

  1. Oracle分析函数入门

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

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

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

  3. [转]oracle 分析函数over

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

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

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

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

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

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

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

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

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

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

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

  9. 强大的oracle分析函数

    转载:https://www.cnblogs.com/benio/archive/2011/06/01/2066106.html 学习步骤:1. 拥有Oracle EBS demo 环境 或者 PRO ...

  10. Oracle分析函数大全

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

随机推荐

  1. ArcGIS最权威、最专业的技术分享网站:积思园(www.iarcgis.com)

    你对iArcGIS.com说点什么 为什么会有该网站的产生 在这个所谓的“大数据”的时代,每个人都深陷于海量信息无法自拔,因为过多碎片化的数据只会让自己的思维更加迷离,快餐式的阅读只会让自己变得虚胖. ...

  2. Ubuntu 安装 PhpMyAdmin 图文教程

    Ubuntu 安装 PhpMyAdmin 管理 MySQL 数据库 PhpMyAdmin 是一个用 PHP 编写的软件工具,可以通过 web方式控制和操作 MySQL 数据库.通过 phpMyAdmi ...

  3. 引入 Tinker 之后如何在 Debug 模式下开启 Instant Run

    在<Tinker + Bugly + Jenkins 爬坑之路>一文中讲了在接入 Tinker 之后,Jenkins 中的一些坑,由此,热修复算告一段落,但是,在直接 Run 模式运行时, ...

  4. 浅谈搜索引擎SEO(HTML/CSS)

    SEO:搜索引擎优化(免费): SEM:搜索引擎营销(付费). 它们两者的区别是: 1.SEM高投入,SEO低投入: 2.SEM短.效益块,SEO长期投入.增长慢: 3.新广告法颁布之后SEM广告位减 ...

  5. FTP自动上传

    注:该脚本上传的压缩文件,通过文件资源管理器拿下来后会提示压缩文件损坏.使用 ftp -s:d:\audit_log\ftp_upload.txt 方法可行(http://www.cnblogs.co ...

  6. Python初学者第二十一天 函数(4)-内置函数

    21day 内置函数: 1.abs()绝对值函数 2.dict()创建一个字典 3.help()获取帮助信息 4.min()从一个列表中取出最小的数 5.max()从一个列表中取出最大值 6.bool ...

  7. zbrush书法文字硬边雕刻

    方法的重点在与边缘环的操作以及模型网格的数量. 1.通过ZAppLink功能可以把制作的文字书法映射到模型上去. 2.遮罩,按照颜色强度遮罩. 3.分组,按照颜色分组.单独显示文字部分的分组.按Ctr ...

  8. December 28th 2016 Week 53rd Wednesday

    Knowledge is a treasure, but practice is the key to it. 知识是珍宝,而实践是获取她的钥匙. I know a lot, but what I r ...

  9. Java 运算符(引用和对象)

    1. 算数运算符 就是+.-.*./.%.++.--这些,没什么好说的,稍微强调下自加,自减: 前缀自增自减法(++i,--i): 先进行自增或者自减运算,再进行表达式运算. 后缀自增自减法(i++, ...

  10. MySQL忘记密码处理方法

    在windows下: 打开命令行窗口,停止mysql服务:        Net stop mysql 在cmd下启动mysql,一般到mysql的安装路径,找到 mysqld-nt.exe 执行:m ...