oracle 分析函数
认识分析函数
分析函数是什么?
分析函数是oracle专门用于解决复杂报表统计需求的功能强大的函数,它可以在数据中进行分组然后计算基于组的某种统计值,并且每一组的每一行都可以返回一个统计值。
分析函数和聚合函数的不同之处是什么?
普通的聚合函数用group by 分组,每个分组返回一个统计值,而分析函数采用partition by 分组,并且每组每行都可以返回一个统计值。
分析函数的形式:
分析函数带有一个开窗函数OVER(),包含三个分析子句:分组(partition by),排序(order by),窗口(Rows),他们的使用形式如下:
Over(Partition By XXX Order by yyy rows between zzz)
注:窗口子句包括:rows方式的窗口,range方式和滑动窗口。
分析函数的例子:
显示各部门员工的工资,并附带显示该部分的最高工资。
select deptno,empno,ename,sal,
last_value(sal) over(partition by deptno order by sal rows between unbounded preceding and unbounded following) max_sal
from emp;
DEPTNO EMPNO ENAME SAL MAX_SAL
10 7934 MILLER 1300.00 5000
10 7782 CLARK 2450.00 5000
10 7839 KING 5000.00 5000
20 7369 SMITH 800.00 3000
20 7876 ADAMS 1100.00 3000
20 7566 JONES 2975.00 3000
20 7788 SCOTT 3000.00 3000
20 7902 FORD 3000.00 3000
30 7900 JAMES 950.00 2850
30 7654 MARTIN 1250.00 2850
30 7521 WARD 1250.00 2850
30 7844 TURNER 1500.00 2850
30 7499 ALLEN 1600.00 2850
30 7698 BLAKE 2850.00 2850
2.理解OVER()函数
2.1两个Order by 的执行时机
分析函数是在整个SQL查询结束后(SQL语句中的ORDER BY的执行比较特殊)再进行的操作,也就是说SQL语句中的ORDER BY 也会影响分析函数的执行结果:
a)两者一致:如果SQL语句中的Order by 满足分析函数分析时要求的排序,那么SQL语句中的排序将先执行,分析函数在分析时就不必再排序。
b)两者不一致:如果SQL语句中的Order by 不满足分析函数分析时要求的排序,那么SQL语句中的排序将最后在分析函数分析结束后执行排序。
2.2 分析函数中的分组/排序/窗口
分析函数 包含三个分析子句:分组(Partition by ),排序(Order by),窗口(Rows)
窗口就是分析函数分析时要处理的数据范围,就拿SUM来说,它是SUM窗口中的记录而不是整个分组中的记录,因此我们在想得到某个栏位的累计值时,我们需要把窗口指定到该分组中的第一行数据到当前行,如果你指定该窗口从该分组中的第一行到最后一行,那么该组中的每一个SUM值都会一样,即整个组的总和。
窗口子句在这里我只说rows方式的窗口,range方式和滑动窗口也不提
窗口子句中我们经常用到指定第一行,当前行,最后一行这样的三个属性.
第一行是unbounded preceding,
当前行是 current row,
最后一行是 unbounded following .
窗口子句不能单独出现,必须有Order By子句时才能出现,如:
last_value(sal) over(partition by deptno order by sal rows between unbounded preceding and unbounded following)
以上示例指定窗口为整个分组.
而出现Order By子句的时候,不一定要有窗口子句,但效果会很不一样,此时的窗口默认是当前组的第一行到当前行!
当省略窗口子句时:
a) 如果存在Order By则默认的窗口是unbounded preceding and current now
b) 如果同时省略Order By则默认的窗口是unbounded preceding and unbounded following
如果省略分组,则把全部记录当成一个组:
a) 如果存在Order By则默认窗口是unbounded preceding and current row
b) 如果这时省略Order By则窗口默认认为unbounded preceding and unbounded following
2.3帮助理解OVER()的实例
例1:SQL无排序,over()排序子句省略
select deptno ,empno,ename , sal ,
last_value(sal) over(partition by deptno )
from emp
where deptno=20
DEPTNO EMPNO ENAME SAL LAST_VALUE(SAL)OVER(PARTITIONB
20 7369 SMITH 800.00 3000
20 7566 JONES 2975.00 3000
20 7788 SCOTT 3000.00 3000
20 7876 ADAMS 1100.00 3000
20 7902 FORD 3000.00 3000
例2:SQL无排序,OVER()排序子句有,窗口省略
Select deptno ,empno,ename , sal ,
last_value(sal) over(partition by deptno order by sal)
from emp where deptno=’30’
DEPTNO EMPNO ENAME SAL LAST_VALUE(SAL)OVER(PARTITIONB
30 7900 JAMES 950.00 950
30 7654 MARTIN 1250.00 1250
30 7521 WARD 1250.00 1250
30 7844 TURNER 1500.00 1500
30 7499 ALLEN 1600.00 1600
30 7698 BLAKE 2850.00 2850
例3:SQL无排序,OVER()排序子句有,窗口也有,窗口特意强调全组数据
select deptno ,empno,ename , sal ,
last_value(sal) over(partition by deptno order by sal
rows between unbounded preceding and unbounded following)
from emp where deptno=30
DEPTNO EMPNO ENAME SAL LAST_VALUE(SAL)OVER(PARTITIONB
30 7900 JAMES 950.00 2850
30 7521 WARD 1250.00 2850
30 7654 MARTIN 1250.00 2850
30 7844 TURNER 1500.00 2850
30 7499 ALLEN 1600.00 2850
30 7698 BLAKE 2850.00 2850
例4:SQL有排序(正序),Over()排序子句无,先做SQL排序再进行分析函数运算。
select deptno ,empno,ename , sal ,
last_value(sal) over(partition by deptno )
from emp
where deptno=30
order by deptno,sal
DEPTNO EMPNO ENAME SAL LAST_VALUE(SAL)OVER(PARTITIONB
30 7900 JAMES 950.00 2850
30 7521 WARD 1250.00 2850
30 7654 MARTIN 1250.00 2850
30 7844 TURNER 1500.00 2850
30 7499 ALLEN 1600.00 2850
30 7698 BLAKE 2850.00 2850
2.4 lag()与lead():求之前与之后的第N行
Lag(arg1,arg2,arg3):
Arg1是从其他行返回的表达式
Arg2 是希望检索的当前行分区的偏移量。是一个正的偏移量,是一个往回检索以前的行的数目。
Arg3是在arg2表示的数目超出了分组的范围时返回的值。
而lead()与lag()相反
2.5. ratio_to_report():求百分比
select empno,ename,sal,deptno,
ratio_to_report(sal) over() as "每个员工的薪水占总工资比",
ratio_to_report(sal) over(partition by deptno) as "每个员工的薪水占部门总薪水的比"
from emp
order by deptno,empno;
EMPNO ENAME SAL DEPTNO 每个员工的薪水占总工资比 每个员工的薪水占部门总薪水的比
7782 CLARK 2450.00 10 0.0844099913867356 0.28
7839 KING 5000.00 10 0.172265288544358 0.571428571428571
7934 MILLER 1300.00 10 0.0447889750215332 0.148571428571429
7369 SMITH 800.00 20 0.0275624461670973 0.0735632183908046
7566 JONES 2975.00 20 0.102497846683893 0.273563218390805
7788 SCOTT 3000.00 20 0.103359173126615 0.275862068965517
7876 ADAMS 1100.00 20 0.0378983634797588 0.101149425287356
7902 FORD 3000.00 20 0.103359173126615 0.275862068965517
7499 ALLEN 1600.00 30 0.0551248923341947 0.170212765957447
7521 WARD 1250.00 30 0.0430663221360896 0.132978723404255
7654 MARTIN 1250.00 30 0.0430663221360896 0.132978723404255
7698 BLAKE 2850.00 30 0.0981912144702842 0.303191489361702
7844 TURNER 1500.00 30 0.0516795865633075 0.159574468085106
7900 JAMES 950.00 30 0.0327304048234281 0.101063829787234
总结:ratio_to_report() 括号中就是分子,
Over()括号中就是分母
有了ratio_to_report(分析函数,我们避免了还需要写分析函数,自己相除的写法。
注意:分母缺省就是占整个比。
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 ...
随机推荐
- 今天网站后台登录页面需要生成一个二维码,然后在手机app上扫描这个二维码,实现网站登录的效果及其解决方案如下
要实现二维码登录,需要解决2个技术,1.需要js websocket 与后台php实现长连接技术 2.实现二维码生成技术 要实现这个功能第二个算是比较简单,只需要下载一个php的二维码生成器即可,但要 ...
- Lua 自定义函数string.split
function string.split(str, delimiter) if str==nil or str=='' or delimiter==nil then return ...
- Android中使用AlarmManager进程被删除的解决办法
http://blog.csdn.net/zhouzhiwengang/article/details/13022325 在Android中,AlarmManager提供了不受休眠状态的系统定时功能, ...
- Ajax在html页面获取后台XML文件资源
一.准备工具 站长吧ASP调试工具.exe,这个工具是为了快速建立asp环境,方便调试. 二.建立文件夹 1.建立网站根文件夹,名字随意,将站长吧ASP调试工具.exe复制到根文件夹: 2.建立xml ...
- grunt压缩js文件
grunt是node中很好的管理项目的工具,利用它可以实现对整个项目的管理,避免很多重复性的工作如合并.压缩,检查语法等. 使用grunt首先要安装node环境,nodejs官网http://node ...
- Unity进阶技巧 - 动态创建UGUI
前言 项目中有功能需要在代码中动态创建UGUI对象,但是在网上搜索了很久都没有找到类似的教程,最后终于在官方文档中找到了方法,趁着记忆犹新,写下动态创建UGUI的方法,供需要的朋友参考 你将学到什么? ...
- qsort函数、sort函数【转】
http://blog.163.com/yuhua_kui/blog/static/9679964420142195442766/ 先说明一下:qsort和sort,只能对连续内存的数据进行排序,像链 ...
- intelliJ idea debug模式下启动慢的原因
今天在idea上以debug方式启动项目的时候,特别慢,启动半天启动不起来,一直以为是数据库连接的原因,但重启mysql服务后也不好使,特别郁闷... 最后发现原来是之前调试的时候加的断点还在,导致启 ...
- OpenResty 是一个全功能的 Web 应用服务器
OpenResty (也称为 ngx_openresty)是一个全功能的 Web 应用服务器.它打包了标准的 Nginx 核心,很多的常用的第三方模块,以及它们的大多数依赖项. 通过众多进行良好设计的 ...
- 如何判断exe或dll的目标平台及是否是.NET?
1. COFF文件头中偏移0处的Machine指示目标机器类型(IMAGE_FILE_MACHINE_AMD64等),偏移18处的Characteristics位指示文件属性(IMAGE_FILE_3 ...