学习Oracle分析函数(Analytic Functions)

Oracle提供了一些功能很强大的分析函数,使用这些函数可以完成可能需要存储过程来实现的需求。

分析函数计算基于一组数据行的聚合值,它们不同于聚合函数的是,它们为每一组返回多行结果。分析函数是除ORDER BY子句之外,在查询语句中最后执行的。所有的join和所有的WHERE ,GROUP BY 和HAVING子句都在分析函数之前执行。所以分析函数只能出现在select或ORDER BY子句中。

下图为11.2版本官方文档中给出的语法示意图:

下面简单介绍一下各个部分:

analytic_function

指定分析函数的名字,后面列出了所有的分析函数

arguments

分析函数可以有0到3个参数。参数可以是任何数值类型或可以隐式转换为数值类型的其他非数值类型。

analytic_clause

用OVER analytic_clause表明函数操作的是一个查询结果集。如果想过滤基于分析函数的查询结果,需要使用嵌套子查询。

query_partition_clause

用PARTITION BY子句来把查询结果集基于一个或多个value_expr分组。如果省略,分析函数把所有行当作一组。

order_by_clause

用order_by_claus指定在一组中数据如何排序。

ASC(default)|DESC

NULLS FIRST(default in DESC)|NULLS LAST(default in ASC)

windowing_clause

部分分析函数允许使用windowing_clause子句。

只有当指定了order_by_clause后才能指定这个子句。

ROWS指定使用物理行的window

RANGE指定使用逻辑偏移的window

详细信息请参考:http://docs.oracle.com/cd/E11882_01/server.112/e41084/functions004.htm#i81407

下面为所有的分析函数,带*号的函数允许使用windowing_clause:

AVG *
CORR *
COUNT *
COVAR_POP *
COVAR_SAMP *
CUME_DIST
DENSE_RANK
FIRST
FIRST_VALUE *
LAG
LAST
LAST_VALUE *
LEAD
LISTAGG
MAX *
MEDIAN
MIN *
NTH_VALUE *
NTILE
PERCENT_RANK
PERCENTILE_CONT
PERCENTILE_DISC
RANK
RATIO_TO_REPORT
REGR_ (Linear Regression) Functions *
ROW_NUMBER
STDDEV *
STDDEV_POP *
STDDEV_SAMP *
SUM *
VAR_POP *
VAR_SAMP *
VARIANCE *

以AVG为例介绍分析函数的使用:

AVG也是一个聚合函数:

[email protected]>select avg(sal) from emp;

  AVG(SAL)
----------
2073.21429

作为分析函数的例子:

eg1:单独使用

[email protected]>select deptno,ename,hiredate,sal,avg(sal) over() avg from emp;

    DEPTNO ENAME			  HIREDATE		     SAL	AVG
---------- ------------------------------ ------------------- ---------- ----------
	20 SMITH			  1980-12-17 00:00:00	     800 2073.21429
	30 ALLEN			  1981-02-20 00:00:00	    1600 2073.21429
	30 WARD 			  1981-02-22 00:00:00	    1250 2073.21429
	20 JONES			  1981-04-02 00:00:00	    2975 2073.21429
	30 MARTIN			  1981-09-28 00:00:00	    1250 2073.21429
	30 BLAKE			  1981-05-01 00:00:00	    2850 2073.21429
	10 CLARK			  1981-06-09 00:00:00	    2450 2073.21429
	20 SCOTT			  1987-04-19 00:00:00	    3000 2073.21429
	10 KING 			  1981-11-17 00:00:00	    5000 2073.21429
	30 TURNER			  1981-09-08 00:00:00	    1500 2073.21429
	20 ADAMS			  1987-05-23 00:00:00	    1100 2073.21429
	30 JAMES			  1981-12-03 00:00:00	     950 2073.21429
	20 FORD 			  1981-12-03 00:00:00	    3000 2073.21429
	10 MILLER			  1982-01-23 00:00:00	    1300 2073.21429

从输出可以看出函数计算出了整体的平均值,并输出到每一行

eg2:使用query_partition_clause

[email protected]>select deptno,ename,hiredate,sal,avg(sal) over(partition by deptno) avg from emp;

    DEPTNO ENAME			  HIREDATE		     SAL	AVG
---------- ------------------------------ ------------------- ---------- ----------
	10 CLARK			  1981-06-09 00:00:00	    2450 2916.66667
	10 KING 			  1981-11-17 00:00:00	    5000 2916.66667
	10 MILLER			  1982-01-23 00:00:00	    1300 2916.66667
	20 JONES			  1981-04-02 00:00:00	    2975       2175
	20 FORD 			  1981-12-03 00:00:00	    3000       2175
	20 ADAMS			  1987-05-23 00:00:00	    1100       2175
	20 SMITH			  1980-12-17 00:00:00	     800       2175
	20 SCOTT			  1987-04-19 00:00:00	    3000       2175
	30 WARD 			  1981-02-22 00:00:00	    1250 1566.66667
	30 TURNER			  1981-09-08 00:00:00	    1500 1566.66667
	30 ALLEN			  1981-02-20 00:00:00	    1600 1566.66667
	30 JAMES			  1981-12-03 00:00:00	     950 1566.66667
	30 BLAKE			  1981-05-01 00:00:00	    2850 1566.66667
	30 MARTIN			  1981-09-28 00:00:00	    1250 1566.66667

[email protected]>select deptno,avg(sal) from emp group by deptno;

    DEPTNO   AVG(SAL)
---------- ----------
	30 1566.66667
	20	 2175
	10 2916.66667

从输出可以看出,AVG计算出了每个部门的平均值,并输出到对应的行。

eg3:使用order_by_clause

[email protected]>select deptno,ename,hiredate,sal,avg(sal) over(partition by deptno order by sal) avg from emp;

    DEPTNO ENAME			  HIREDATE		     SAL	AVG
---------- ------------------------------ ------------------- ---------- ----------
	10 MILLER			  1982-01-23 00:00:00	    1300       1300
	10 CLARK			  1981-06-09 00:00:00	    2450       1875
	10 KING 			  1981-11-17 00:00:00	    5000 2916.66667
	20 SMITH			  1980-12-17 00:00:00	     800	800
	20 ADAMS			  1987-05-23 00:00:00	    1100	950
	20 JONES			  1981-04-02 00:00:00	    2975       1625
	20 SCOTT			  1987-04-19 00:00:00	    3000       2175
	20 FORD 			  1981-12-03 00:00:00	    3000       2175
	30 JAMES			  1981-12-03 00:00:00	     950	950
	30 MARTIN			  1981-09-28 00:00:00	    1250       1150
	30 WARD 			  1981-02-22 00:00:00	    1250       1150
	30 TURNER			  1981-09-08 00:00:00	    1500     1237.5
	30 ALLEN			  1981-02-20 00:00:00	    1600       1310
	30 BLAKE			  1981-05-01 00:00:00	    2850 1566.66667

从输出结果可以看出,每个部门的行都按sal做了升序排序。

eg4:使用windowing_clause

[email protected]>select deptno,ename,hiredate,sal,avg(sal) over(partition by deptno order by sal rows BETWEEN 1 PRECEDING AND 1 FOLLOWING) avg from emp;

    DEPTNO ENAME			  HIREDATE		     SAL	AVG
---------- ------------------------------ ------------------- ---------- ----------
	10 MILLER			  1982-01-23 00:00:00	    1300       1875
	10 CLARK			  1981-06-09 00:00:00	    2450 2916.66667
	10 KING 			  1981-11-17 00:00:00	    5000       3725
	20 SMITH			  1980-12-17 00:00:00	     800	950
	20 ADAMS			  1987-05-23 00:00:00	    1100       1625
	20 JONES			  1981-04-02 00:00:00	    2975 2358.33333
	20 SCOTT			  1987-04-19 00:00:00	    3000 2991.66667
	20 FORD 			  1981-12-03 00:00:00	    3000       3000
	30 JAMES			  1981-12-03 00:00:00	     950       1100
	30 MARTIN			  1981-09-28 00:00:00	    1250       1150
	30 WARD 			  1981-02-22 00:00:00	    1250 1333.33333
	30 TURNER			  1981-09-08 00:00:00	    1500       1450
	30 ALLEN			  1981-02-20 00:00:00	    1600 1983.33333
	30 BLAKE			  1981-05-01 00:00:00	    2850       2225

从输出的结果可以看出,分析函数对每一组中的每一行的输出结果是把它自己与它的上一行和下一行这三行求平均值。

分析函数太多,这里就不一一介绍功能了,有兴趣的同学可以点开上面的连接,去查看对应的功能。

时间: 2024-10-05 05:07:05

学习Oracle分析函数(Analytic Functions)的相关文章

学习Oracle分析函数

Oracle提供了一些功能很强大的分析函数,使用这些函数可以完成可能需要存储过程来实现的需求. 分析函数计算基于一组数据行的聚合值,它们不同于聚合函数的是,它们为每一组返回多行结果.分析函数是除ORDER BY子句之外,在查询语句中最后执行的.所有的join和所有的WHERE ,GROUP BY 和HAVING子句都在分析函数之前执行.所以分析函数只能出现在select或ORDER BY子句中. 绍一下各个部分: analytic_function 指定分析函数的名字,后面列出了所有的分析函数

Oracle分析函数学习总结

在公司经常会用到oracle分析函数,在统计这块用处很大,特别是复杂的sql查询,我就在这边结合网络一些资料进行了总结,希望可以帮助到大家: Oracle分析函数--函数列表 SUM         :该函数计算组中表达式的累积和 MIN         :在一个组中的数据窗口中查找表达式的最小值 MAX         :在一个组中的数据窗口中查找表达式的最大值 AVG          :用于计算一个组和数据窗口内表达式的平均值. COUNT       :对一组内发生的事情进行累积计数 -

Analytic Functions in Oracle

Contents Overview and IntroductionHow Analytic Functions WorkThe SyntaxExamplesCalculate a running TotalTop-N Queries    Example 1    Example 2Windows    Range Windows    Compute average salary for defined range    Row Windows    Accessing Rows Aroun

oracle菜鸟学习之 分析函数-排序

oracle菜鸟学习之 分析函数-排序 排序函数 1.row_number:返回连续的排序,无论值是否相等2.rank:具有相等值得行排序相同,序数值随后跳跃3.dense_rank:具有相等值得行排序相同,序号是连续得 实验表 create table chengji(sno number,km varchar2(10),score number); insert into chengji values(1,'YW',60); insert into chengji values(1,'SX'

第五篇 Getting Started with ORACLE EBS(开始学习ORACLE EBS)

第一篇介绍了ERP软件是供应链管理软件.告诉你这个软件改善或提升企业管理的切入点和着力点.有了着力点才能给力. 第二篇介绍了什么是咨询以及咨询工作共通的章法,告诉了你咨询的套路是什么,就像练习一套拳,套路就是这样的,这些是形式的东西. 第三篇介绍了EXCEL和基于数据库的软件在数据处理方面的异同. 第四篇介绍了在国内做咨询你应该具备的一些基础理论常识. 从本篇也就是第五篇开始着手介绍一些循序渐进学习ORACLE EBS的知识.面向的读者是ORACLE EBS系统实施新手.并欢迎高手不吝批评纠正.

oracle分析函数 (转)

一.总体介绍 12.1 分析函数如何工作 语法 FUNCTION_NAME(<参数>,…) OVER (<PARTITION BY 表达式,…> <ORDER BY 表达式 <ASC DESC> <NULLS FIRST NULLS LAST>> <WINDOWING子句>) PARTITION子句 ORDER BY子句 WINDOWING子句 缺省时相当于RANGE UNBOUNDED PRECEDING 1. 值域窗(RANGE

常用Oracle分析函数详解

学习步骤:1. 拥有Oracle EBS demo 环境 或者 PROD 环境2. copy以下代码进 PL/SQL3. 配合解释分析结果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

如何学习Oracle

如何学习Oracle?分清几个概念是关键 经常有一些Oracle的初学者问到以下几个问题,这里集中解答一下,希望对大家有帮助. 1.如果有一定的数据库基础,知道SQL是怎么回事,即使写不出来简单的SQL,但可以看动它们,你就可以跳到2.否则请先看一下数据库基础和SQL语言,不需要很深,更不需要去记忆那些复杂的SQL命令,这些可以留在以后边应用边学习.记忆. 2.要想学好ORACLE,首先要学习ORACLE的体系结构,现在你不需要深入理解它们,但要分清几个关键的概念: instance & dat

学习oracle数据库引航二——后台进程

from 谭怀远--数据库领航 后台进程 一.system monitor(SMON) (非正常关闭后的)实例恢复 二.process monitor(PMON) 回滚事务 释放锁及其它资源 重启死掉的调度器.(在共享服务器中用).分配用户连到哪个服务器上. 在监听器中注册服务信息 三.DBWn和LGWR DBWRn下写入磁盘文件 四.check point(CKPT) 喊DBWn写脏数据 完后会更新DATAFILE的HEADER和控制文件的HEADER.而HEADER中有同步所需要的信息,即C