`

Oracle开发专题之:分析函数(OVER) (转载)

 
阅读更多

目录:
===============================================
1.Oracle分析函数简介
2.Oracle分析函数简单实例
3.分析函数OVER解析

一、Oracle分析函数简介:

在日常的生产环境中,我们接触得比较多的是OLTP系统(即Online Transaction Process),这些系统的特点是具备实时要求,或者至少说对响应的时间多长有一定的要求;其次这些系统的业务逻辑一般比较复杂,可能需要经过多次的运算。比如我们经常接触到的电子商城。

在这些系统之外,还有一种称之为OLAP的系统(即Online Aanalyse Process),这些系统一般用于系统决策使用。通常和数据仓库、数据分析、数据挖掘等概念联系在一起。这些系统的特点是数据量大,对实时响应的要求不高或者根本不关注这方面的要求,以查询、统计操作为主。

我们来看看下面的几个典型例子:
①查找上一年度各个销售区域排名前10的员工
②按区域查找上一年度订单总额占区域订单总额20%以上的客户
③查找上一年度销售最差的部门所在的区域
④查找上一年度销售最好和最差的产品

我们看看上面的几个例子就可以感觉到这几个查询和我们日常遇到的查询有些不同,具体有:

①需要对同样的数据进行不同级别的聚合操作
②需要在表内将多条数据和同一条数据进行多次的比较
③需要在排序完的结果集上进行额外的过滤操作

 

分析函数语法:
FUNCTION_NAME(<argument>,<argument>...)
OVER(<Partition-Clause><Order-by-Clause><Windowing Clause>)

:
sum(sal) over (partition by deptno order by ename) new_alias
sum
就是函数名,(sal)是分析函数的参数,每个函数有0~3个参数,参数可以是表达式,例如:sum(sal+comm)
over
是一个关键字,用于标识分析函数,否则查询分析器不能区别sum()聚集函数和sum()分析函数
partition by deptno
是可选的分区子句,如果不存在任何分区子句,则全部的结果集可看作一个单一的大区
order by ename
是可选的order by 子句,有些函数需要它,有些则不需要.依靠已排序数据的那些函数,:用于访问结果集中前一行和后一行的LAGLEAD,必须使用,其它函数,AVG,则不需要.在使用了任何排序的开窗函数时,该子句是强制性的,它指定了在计算分析函数时一组内的数据是如何排序的.

1)FUNCTION子句
ORACLE提供了26个分析函数,按功能分5
分析函数分类
等级(ranking)函数:用于寻找前N种查询
开窗(windowing)函数:用于计算不同的累计,SUM,COUNT,AVG,MIN,MAX,作用于数据的一个窗口上
:
sum(t.sal) over (order by t.deptno,t.ename) running_total,
sum(t.sal) over (partition by t.deptno order by t.ename) department_total
制表(reporting)函数:与开窗函数同名,作用于一个分区或一组上的所有列
:
sum(t.sal) over () running_total2,
sum(t.sal) over (partition by t.deptno ) department_total2
制表函数与开窗函数的关键不同之处在于OVER语句上缺少一个ORDER BY子句!
LAG,LEAD函数:这类函数允许在结果集中向前或向后检索值,为了避免数据的自连接,它们是非常用用的.
VAR_POP,VAR_SAMP,STDEV_POPE
及线性的衰减函数:计算任何未排序分区的统计值

2)PARTITION子句
按照表达式分区(就是分组),如果省略了分区子句,则全部的结果集被看作是一个单一的组

3)ORDER BY子句
分析函数中ORDER BY的存在将添加一个默认的开窗子句,这意味着计算中所使用的行的集合是当前分区中当前行和前面所有行,没有ORDER BY,默认的窗口是全部的分区 Order by 子句后可以添加nulls last,:order by comm desc nulls last   表示排序时忽略comm列为空的行.   

4)WINDOWING子句
用于定义分析函数将在其上操作的行的集合
Windowing
子句给出了一个定义变化或固定的数据窗口的方法,分析函数将对这些数据进行操作
默认的窗口是一个固定的窗口,仅仅在一组的第一行开始,一直继续到当前行,要使用窗口,必须使用ORDER BY子句
根据2个标准可以建立窗口:数据值的范围(RANGES)或与当前行的行偏移量.

5)Rang窗口
Range 5 preceding:将产生一个滑动窗口,他在组中拥有当前行以前5行的集合
ANGE
窗口仅对NUMBERSDATES起作用,因为不可能从VARCHAR2中增加或减去N个单元
另外的限制是ORDER BY中只能有一列,因而范围实际上是一维的,不能在N维空间中
:
avg(t.sal) over(order by t.hiredate asc range 100 preceding)
统计前100天平均工资

6)Row窗口
利用ROW分区,就没有RANGE分区那样的限制了,数据可以是任何类型,ORDER BY 可以包括很多列

7)Specifying窗口
UNBOUNDED PRECEDING:
这个窗口从当前分区的每一行开始,并结束于正在处理的当前行
CURRENT ROW:
该窗口从当前行开始(并结束)
Numeric Expression PRECEDING:
对该窗口从当前行之前的数字表达式(Numeric Expression)的行开始,RANGE来说,从从行序值小于数字表达式的当前行的值开始.
Numeric Expression FOLLOWING:
该窗口在当前行Numeric Expression行之后的行终止(或开始),且从行序值大于当前行Numeric Expression行的范围开始(或终止)
range between 100 preceding and 100 following:
当前行100,当前后100

注意:分析函数允许你对一个数据集进排序和筛选,这是SQL从来不能实现的.除了最后的Order by子句之外,分析函数是在查询中执行的最后的操作集,这样的话,就不能直接在谓词中使用分析函数,即不能在上面使用wherehaving子句。


二、Oracle分析函数简单实例:

下面我们通过一个实际的例子:按区域查找上一年度订单总额占区域订单总额20%以上的客户,来看看分析函数的应用。

【1】测试环境:

SQL> desc orders_tmp;
 Name                          
Null    Type
 
----------------------- -------- ----------------
 CUST_NBR                    NOT NULL NUMBER(5)
 REGION_ID                  
NOT NULL NUMBER(5)
 SALESPERSON_ID      
NOT NULL NUMBER(5)
 
YEAR                           NOT NULL NUMBER(4)
 
MONTH                        NOT NULL NUMBER(2)
 TOT_ORDERS              
NOT NULL NUMBER(7)
 TOT_SALES                
NOT NULL NUMBER(11,2)


【2】测试数据:

SQL> select * from orders_tmp;

  CUST_NBR  REGION_ID SALESPERSON_ID       
YEAR      MONTH TOT_ORDERS  TOT_SALES
---------- ---------- -------------- ---------- ---------- ---------- ----------
        11          7             11                       2001          7          2      12204
         
4          5              4                         2001         10         2      37802
         
7          6              7                         2001          2          3       3750
        
10          6              8                        2001          1          2      21691
        
10          6              7                        2001          2          3      42624
        
15          7             12                       2000          5          6         24
        
12          7              9                        2000          6          2      50658
         
1          5              2                         2000          3          2      44494
         
1          5              1                         2000          9          2      74864
         
2          5              4                         2000          3          2      35060
         
2          5              4                         2000          4          4       6454
         
2          5              1                         2000         10          4      35580
         
4          5              4                         2000         12          2      39190

13 rows selected.


【3】测试语句:

SQL> select o.cust_nbr customer,
  
2         o.region_id region,
  
3         sum(o.tot_sales) cust_sales,
  
4         sum(sum(o.tot_sales)) over(partition by o.region_id) region_sales
  
5    from orders_tmp o
  
6   where o.year = 2001
  
7   group by o.region_id, o.cust_nbr;

  CUSTOMER     REGION CUST_SALES REGION_SALES
---------- ---------- ---------- ------------
         4              5      37802        37802
         
7              6       3750         68065
        
10             6      64315        68065
        
11             7      12204        12204


三、分析函数OVER解析:

请注意上面的绿色高亮部分,group by的意图很明显:将数据按区域ID,客户进行分组,那么Over这一部分有什么用呢?假如我们只需要统计每个区域每个客户的订单总额,那么我们只需要group by o.region_id,o.cust_nbr就够了。但我们还想在每一行显示该客户所在区域的订单总额,这一点和前面的不同:需要在前面分组的基础上按区域累加。很显然group by和sum是无法做到这一点的(因为聚集操作的级别不一样,前者是对一个客户,后者是对一批客户)。

这就是over函数的作用了!它的作用是告诉SQL引擎:按区域对数据进行分区,然后累积每个区域每个客户的订单总额(sum(sum(o.tot_sales)))。

现在我们已经知道2001年度每个客户及其对应区域的订单总额,那么下面就是筛选那些个人订单总额占到区域订单总额20%以上的大客户了

SQL> select *
  
2    from (select o.cust_nbr customer,
  
3                 o.region_id region,
  
4                 sum(o.tot_sales) cust_sales,
  
5                 sum(sum(o.tot_sales)) over(partition by o.region_id) region_sales
  
6            from orders_tmp o
  
7           where o.year = 2001
  
8           group by o.region_id, o.cust_nbr) all_sales
  
9   where all_sales.cust_sales > all_sales.region_sales * 0.2;

  CUSTOMER     REGION CUST_SALES REGION_SALES
---------- ---------- ---------- ------------
         4          5      37802        37802
        
10          6      64315        68065
        
11          7      12204        12204

SQL
> 


现在我们已经知道这些大客户是谁了!哦,不过这还不够,如果我们想要知道每个大客户所占的订单比例呢?看看下面的SQL语句,只需要一个简单的Round函数就搞定了。

SQL> select all_sales.*,
  
2         100 * round(cust_sales / region_sales, 2|| '%' Percent
  3    from (select o.cust_nbr customer,
  
4                 o.region_id region,
  
5                 sum(o.tot_sales) cust_sales,
  
6                 sum(sum(o.tot_sales)) over(partition by o.region_id) region_sales
  
7            from orders_tmp o
  
8           where o.year = 2001
  
9           group by o.region_id, o.cust_nbr) all_sales
 
10   where all_sales.cust_sales > all_sales.region_sales * 0.2;

  CUSTOMER     REGION CUST_SALES REGION_SALES 
PERCENT
---------- ---------- ---------- ------------ ----------------------------------------
         4            5                  37802        37802    100%
        
10           6                  64315        68065      94%
        
11           7                  12204        12204    100%

SQL
> 


总结:

①Over函数指明在那些字段上做分析,其内跟Partition by表示对数据进行分组。注意Partition by可以有多个字段。

②Over函数可以和其它聚集函数、分析函数搭配,起到不同的作用。例如这里的SUM,还有诸如Rank,Dense_rank等。

 

 

转载自:http://www.blogjava.net/pengpenglin/archive/2008/06/25/210536.html

分享到:
评论

相关推荐

    蚁群算法和BP神经网络的Java实现.zip

    该资源内项目源码是个人的课程设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。 该资源内项目源码是个人的课程设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示

    6-1儿童节快乐项目游戏开发

    项目整体思路: 做出几个场景, 总体是冒险类型的, 没有战斗场景, 所以不能算是RPG 使用语言: C++ 使用游戏引擎: Cocos2d-x 3.16

    基于Selenium的Java爬虫实战(内含谷歌浏览器Chrom和Chromedriver版本116.0.5818.0)

    资源包括: 1.Java爬虫实战代码 2.selenium学习笔记 3.代码演示视频 4.谷歌浏览器chrom116.0.5818.0 chrome-linux64.zip chrome-mac-arm64.zip chrome-mac-x64.zip chrome-win32.zip chrome-win64.zip 5.谷歌浏览器驱动器Chromedriver116.0.5818.0 chromedriver-linux64.zip chromedriver-mac-arm64.zip chromedriver-mac-x64.zip chromedriver-win32.zip chromedriver-win64.zip 特别说明:Chrome 为测试版(不会自动更新) 仅适用于自动测试。若要进行常规浏览,请使用可自动更新的标准版 Chrome。)

    毕业设计,基于用户行为的社交网络推荐算法研究与实现

    基于用户行为的社交网络推荐算法研究与实现是一个结合了数据挖掘、机器学习和社交网络分析的项目。这个项目可以用于推荐用户可能感兴趣的内容或用户,以提高社交网络的互动性和用户体验。以下是一个基于用户行为的社交网络推荐算法的研究与实现建议: ### 1. 需求分析 - **用户角色**:确定系统的主要用户角色,如普通用户、内容创作者、管理员等。 - **核心功能**: - 用户行为分析:收集和分析用户在社交网络上的行为数据,如点赞、评论、分享等。 - 推荐算法:基于用户行为数据,设计推荐算法,推荐用户可能感兴趣的内容或用户。 - 系统集成:将推荐算法集成到社交网络平台中,实现推荐功能。 - 性能评估:评估推荐算法的准确性和效率。 ### 2. 技术选型 - **数据收集与处理**:使用爬虫或API接口收集用户行为数据,使用Python的Pandas、NumPy等库进行数据处理。 - **推荐算法**:研究并实现多种推荐算法,如协同过滤、基于内容的推荐、基于图的推荐等。 - **机器学习库**:使用Python的Scikit-learn、TensorFlow、PyTorch等库进

    基于Selenium的Java爬虫实战(内含谷歌浏览器Chrom和Chromedriver版本115.0.5790.90)

    资源包括: 1.Java爬虫实战代码 2.selenium学习笔记 3.代码演示视频 4.谷歌浏览器chrom115.0.5790.90 chrome-linux64.zip chrome-mac-arm64.zip chrome-mac-x64.zip chrome-win32.zip chrome-win64.zip 5.谷歌浏览器驱动器Chromedriver115.0.5790.90 chromedriver-linux64.zip chromedriver-mac-arm64.zip chromedriver-mac-x64.zip chromedriver-win32.zip chromedriver-win64.zip 特别说明:Chrome 为测试版(不会自动更新) 仅适用于自动测试。若要进行常规浏览,请使用可自动更新的标准版 Chrome。)

    2024嵌入式面试资料嵌入式岗位笔试面试真题讲解文档

    2024嵌入式面试资料嵌入式岗位笔试面试真题讲解文档提取方式是百度网盘分享地址

    GSP质量管理制度执行情况检查考核记录

    GSP质量管理制度执行情况检查考核记录

    基于Selenium的Java爬虫实战(内含谷歌浏览器Chrom和Chromedriver版本115.0.5790.102)

    资源包括: 1.Java爬虫实战代码 2.selenium学习笔记 3.代码演示视频 4.谷歌浏览器chrom115.0.5790.102 chrome-linux64.zip chrome-mac-arm64.zip chrome-mac-x64.zip chrome-win32.zip chrome-win64.zip 5.谷歌浏览器驱动器Chromedriver115.0.5790.102 chromedriver-linux64.zip chromedriver-mac-arm64.zip chromedriver-mac-x64.zip chromedriver-win32.zip chromedriver-win64.zip 特别说明:Chrome 为测试版(不会自动更新) 仅适用于自动测试。若要进行常规浏览,请使用可自动更新的标准版 Chrome。)

    热浸镀铝不锈钢板热处理工艺研究

    本试验以316L不锈钢为基体,先对试样进行热浸镀铝试验,之后再对热浸镀铝后的不锈钢分别进行300℃、500℃以及670℃三种温度下的热处理,保温4h和16h。热处理完成后再对试样分别进行硬度测试以及结合力试验。最后是用SEM、EDS以及XRD对试样进行元素分布、物相组成、组织形貌的分析。结果显示300℃温度下保温4h和16h,热处理对试样的性能提升有限,硬度以及结合力的性能相比原试样略微提升,镀层也没有出现裂纹或者孔隙,形貌较完好;而500℃温度下的保温,4h以及16h分别对试样性能提升十分明显,试样依旧没有出现裂纹与孔隙,而且在不锈钢基体和镀铝层之间形成了明显的分界层,形成了呈现球状的铁铝相;而对于670℃,因为不锈钢基体和镀铝层的晶界效应发生的程度的相对的不稳定,且生成了大量的质地很脆的呈针状形态的β(Al-Fe-Si)相以及大量大小不一的斑点形态的Al57Mn12,这使得镀层整体的内部组织严重不均匀,一系列问题从而导致了镀铝层出现了大量的裂纹和孔洞,从而使得670℃的热处理对镀铝层有害。最终500℃加热保温16h对性能提升效果最好,670℃保温加热16h对性能的提升最差。

    华为OD机试C卷- 迷宫问题(Java & JS & Python).md-私信看全套OD代码及解析

    私信博主免费看所有华为OD真题、考试报告、手撕代码、面试记录

    华为OD机试C卷- 九宫格按键输入(Java & JS & Python).md-私信看全套OD代码及解析

    私信博主免费看所有华为OD真题、考试报告、手撕代码、面试记录

    OLT-MA5680T-标准配置-20171127

    华为PON网络OLT设备MA5680T配置说明

    基于微信小程序的优购电商小程序(后端接口ssm框架实现)-毕设项目

    毕业设计基于微信小程序的优购电商小程序(后端接口ssm框架实现)-毕设项目.zip 个人经导师指导并认可通过的高分设计项目,评审分98分。主要针对计算机相关专业的正在做毕设的学生和需要项目实战练习的学习者,也可作为课程设计、期末大作业。 项目介绍: 优购电商小程序项目, 前端为微信小程序,后端接口为ssm框架实现,项目包含源码、数据库毕业设计基于微信小程序的优购电商小程序(后端接口ssm框架实现)-毕设项目.zip 个人经导师指导并认可通过的高分设计项目,评审分98分。主要针对计算机相关专业的正在做毕设的学生和需要项目实战练习的学习者,也可作为课程设计、期末大作业。 项目主要功能: "优购电商小程序是一款基于微信小程序平台的电子商务应用。该项目采用后端SSM(Spring、SpringMVC、MyBatis)框架实现接口,提供稳定的服务支持。主要功能包括商品浏览、购物车管理、订单处理及用户交互等,打造便捷的移动端购物体验。其特点在于深度融合微信生态,易于分享,具有良好的用户体验。技术栈涵盖小程序开发、Java后端编程和数据库管理,适合计算机科学与技术专业的毕设项目。"

    2024年知识图谱行业趋势洞察.pptx

    行业报告

    2024嵌入式大厂面经恒光科技

    2024嵌入式大厂面经恒光科技提取方式是百度网盘分享地址

    2024嵌入式大厂面经赛科世纪面试题

    2024嵌入式大厂面经赛科世纪面试题提取方式是百度网盘分享地址

    2024嵌入式面试资料蔚来2021嵌入式软件开发

    2024嵌入式面试资料蔚来2021嵌入式软件开发提取方式是百度网盘分享地址

    基于ssm+mysql的校园失物招领管理系统源码+数据库脚本(高分毕设项目)

    基于ssm+mysql的校园失物招领管理系统源码+数据库脚本(高分毕设项目)含有代码注释,新手也可看懂。毕业设计、期末大作业、课程设计、高分必看,下载下来,简单部署,就可以使用,该项目可以作为毕设、期末大作业使用,系统功能完善、界面美观、操作简单、功能齐全、管理便捷,具有很高的实际应用价值,项目都经过严格调试,确保可以运行! 基于ssm+mysql的校园失物招领管理系统源码+数据库脚本(高分毕设项目)含有代码注释,新手也可看懂。毕业设计、期末大作业、课程设计、高分必看,下载下来,简单部署,就可以使用,该项目可以作为毕设、期末大作业使用,系统功能完善、界面美观、操作简单、功能齐全、管理便捷,具有很高的实际应用价值,项目都经过严格调试,确保可以运行! 基于ssm+mysql的校园失物招领管理系统源码+数据库脚本(高分毕设项目)含有代码注释,新手也可看懂。毕业设计、期末大作业、课程设计、高分必看,下载下来,简单部署,就可以使用,该项目可以作为毕设、期末大作业使用,系统功能完善、界面美观、操作简单、功能齐全、管理便捷,具有很高的实际应用价值,项目都经过严格调试,确保可以运行!

    fpga中国创新中心.docx

    fpga中国创新中心 FPGA中国创新中心致力于推动FPGA技术在中国的应用和发展,提供FPGA相关的培训、技术支持和创新项目孵化服务。中心配备了先进的FPGA开发平台和实验设备,旨在培养FPGA领域的专业人才。

    校园社区论坛毕设项目,基于SpringBoot和Vue.js框架,类似牛客网讨论区 使用Spring Boot

    基于SpringBoot和Vue.js的校园社区论坛毕设项目是一个集成了多种现代Web技术的大规模系统。以下是一个基于这些技术栈的校园社区论坛的设计与实现建议: ### 1. 需求分析 - **用户角色**:确定系统的主要用户角色,如普通用户、版主、管理员等。 - **核心功能**: - 帖子发布与浏览:用户可以发布新帖子,浏览帖子列表。 - 回复与评论:用户可以对帖子发表回复和评论。 - 用户系统:注册、登录、个人中心等基础用户功能。 - 版块管理:版主可以管理所属版块的帖子、回复和评论。 - 后台管理:管理员可以管理整个论坛的内容、用户、版块等。 ### 2. 技术选型 - **前端**:Vue.js、Vuex、Vue Router。 - **后端**:Java(Spring Boot)、Spring MVC、MyBatis用于数据库操作。 - **数据库**:MySQL、Oracle或PostgreSQL等。 - **服务器**:Tomcat或Jetty。 - **缓存系统**:Redis。 - **日志系统**:ELK(Elasticsearch、Logst

Global site tag (gtag.js) - Google Analytics