[Oracle] 分析功能(1)- 语法

简介:

语法概览




Analytic-Function


Analytic_Clause之PARTITION子句


Analytic_Clause之ORDER BY子句


Analytic_Clause之WINDOWING子句




举例:

以下看一个样例简单过下语法:

例:
sum(sal) over (partition by deptno order by ename) new_alias

sum就是函数名

(sal)是分析函数的參数,每一个函数有0~3个參数,參数能够是表达式,比如:sum(sal+comm)

over() 是开窗函数。这是开启分析函数的起点,对于既可作为聚集函数又可作为分析函数的函数,Oracle无法识别,必须用over来标识此函数为分析函数,此处不可省。

partition by deptno 是可选的分区子句,假设不存在不论什么分区子句,则所有的结果集可看作一个单一的大区
ORDER by则是窗体规则;
ROW |range BETWEEN...AND 是窗体范围(row就像通过自身位置的前后物理座位来找相应的位置。相对固定。而range是通过某种条件来找位置,须要计算方能确定相应位置,如长我3岁和小我两岁的人。)


关于窗体范围的取数方式有多种,看似很复杂,事实上不难,我们開始慢慢剖析:
 
 关键位置就3个:1. 分组第一行Unbounded preceding  2. 当前行Current ROW  3.分组最后一行 Unbounded following
 
 接下来,产生了最简单的三个取数范围: 
 
     分组第一行->当前行 rows [between] unbounded preceding [and current row]。
     分组第一行->分组最后一行   rows between unbounded preceding and unbounded following。 
     当前行->分组最后一行 rows between current row and unbounded following
     
 为什么课程分析函数会让人觉的很复杂呢。我们来看看,这个窗体范围有两种取数方式,一个是依据物理位置。就是rowkeyword。一个是依据逻辑位置取数,就是range,这时刚才的取数范围从3个变成6个了,例如以下:
 
 ROWS的  分组第一行->当前行。分组第一行->分组最后一行。 当前行->分组最后一行
 RANGE的 分组第一行->当前行,分组第一行->分组最后一行, 当前行->分组最后一行
 
 只是这种场景都考虑周全了吗,还有没有漏考虑的,有啊。我们继续看看有哪些可能:


   从分组第一行->当前行前n行             rows between unbounded preceding and n行 preceding
   从分组第一行->当前行后n行             rows between unbounded preceding and n行 following                                   
                                    
   从当前行->当前行后n行                 rows between current row and n行 following
   从当前行前n行->当前行                 rows between n行 preceding and CURRENT ROW
                                    
   从当前行前n行->分组最后一行           rows between n行 preceding and unbounded following
   从当前行后n行->分组最后一行           rows between n行 following and unbounded following
   从当前行前n1行->到当前行前n2行        rows between n1行 preceding and n2行 preceding
   从当前行后n1行->到当前行后n2行        rows between n1行 following and n2行 following
   
   还有没有。有!
   
   从当前行前n1行到当前行后n2行          rows BETWEEN n1行 preceding and n2行 following
   
   还有没有比方从分组第一行后n行到当前行,从当前行到分组最后一行前n行啥的啊? 
   哦。那倒是没有了,对了,你脑子还不够迷糊啊,记这么多???
   
   总算结束了,只是另一个窗体開始于当前行,结束于当前行的。只是这无意义,要了干啥呢?所以,算算,至少有9个。
   考虑到rows 和range两套人马。这下又多了18个了。加上前面的6个,就是24个了。

只是后面多出来的这18个,用到的几率比前面6个要少不少。


   对了。另一件非常重要的事要交代
     
     不写between AND  ,在有order BY 的情况下,就是分组第一行到当前行                        BETWEEN unbounded preceding  and current row
     不写between AND  ,在没有order BY 的情况下。就是分组第一行到分组最后一行;     BETWEEN unbounded preceding and unbounded following 


分析函数 VS 聚合函数

从上面的样例我们能够知道,分析函数和聚合函数的主要差异有:

 1. 分析函数每组有多少行就返回多少行(好比多一个伪列)。而聚合函数是每组无论有多少行都被聚合成一行。

2. 分析函数的order by 和聚合函数order by 排序的概念不一样,分析函数的order BY 标记从分组第一行到当前行的范围圈定,然后根据这个范围,根据这个顺序開始聚合累加。集合函数oracle by它不影响数据,只影响排序。


版权声明:本文博客原创文章,博客,未经同意,不得转载。







本文转自mfrbuaa博客园博客,原文链接:http://www.cnblogs.com/mfrbuaa/p/4689223.html,如需转载请自行联系原作者


相关文章
|
7月前
|
SQL Oracle 关系型数据库
java实现oracle和mysql的group by分组功能|同时具备max()/min()/sum()/case when 函数等功能
java实现oracle和mysql的group by分组功能|同时具备max()/min()/sum()/case when 函数等功能
|
7月前
|
SQL Oracle 关系型数据库
Polar DB-O (兼容 Oracle 语法版本)和Polar DB PostgreSQL 版本概述(二)
Polar DB-O (兼容 Oracle 语法版本)和Polar DB PostgreSQL 版本概述(二)
692 0
|
8月前
|
Oracle 关系型数据库 数据库
一篇文章教你学会使用Oracle 数据库中、WITH 临时表名 AS ()语法
一篇文章教你学会使用Oracle 数据库中、WITH 临时表名 AS ()语法
69 0
|
8月前
|
Oracle 关系型数据库 数据库
一篇文章带你了解Oracle 数据库中 CROSS JOIN(cross join) 语法的作用
一篇文章带你了解Oracle 数据库中 CROSS JOIN(cross join) 语法的作用
302 0
|
8月前
|
SQL Oracle 关系型数据库
Oracle 数据库 常见SQL语法
Oracle 数据库 常见SQL语法
120 0
|
9月前
|
存储 SQL 负载均衡
达梦数据库与Oracle数据库:功能、性能和适用场景对比
数据库在现代信息技术领域中扮演着至关重要的角色。在企业级应用中,选择正确的数据库管理系统对于数据存储、处理和查询效率至关重要。本文将对比两个备受关注的数据库管理系统——达梦数据库和Oracle数据库,从功能、性能和适用场景等方面进行深入探讨,以帮助读者在选择合适数据库时做出明智的决策。
2069 1
|
10月前
|
存储 SQL Oracle
Oracle存储过程~基本语法
Oracle存储过程~基本语法
|
编解码 Oracle 关系型数据库
安装增强功能失败:Could not mount the media/drive C:\Program Files\Oracle\VirtualBox/VBoxGuestAdditions.iso
安装增强功能失败:Could not mount the media/drive C:\Program Files\Oracle\VirtualBox/VBoxGuestAdditions.iso
298 0
安装增强功能失败:Could not mount the media/drive C:\Program Files\Oracle\VirtualBox/VBoxGuestAdditions.iso
|
SQL Oracle 关系型数据库
在Oracle中,什么是Quote(q) Q语法?
在Oracle中,什么是Quote(q) Q语法?
149 0
|
Oracle 关系型数据库
oracle学习58-plsql轻量版基本语法
oracle学习58-plsql轻量版基本语法
144 0
oracle学习58-plsql轻量版基本语法