认识分析函数

分析函数是什么?

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

  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. 《Web全栈工程师的自我修养》读书笔记(转载)

    [声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/5 ...

  2. python之目录文件操作

    [1.os] 1.重命名:os.rename(old, new) 2.删除:os.remove(file) 3.列出目录下的文件 :os.listdir(path) 4.获取当前工作目录:os.get ...

  3. kuangbin_SegTree I (HDU 1540)

    做完D之后我信誓旦旦以为之后就只剩一个二维就能攻克线段树了 看来也跟图论一样全是模板嘛 然后我打开了I题一眼看下去似乎直接用线段树记录sum然后跟区间长度比较然后处理一下实现也不难 两个小时后:特么的 ...

  4. CSS初体验

    经过学习,我对css有了初步的认识.css是层叠样式表(Cascading Style Sheets的缩写,它用于HTML元素的显示形式,是W3C推出的格式化的标准技术.CSS现在已经被大多数浏览器所 ...

  5. Http协议:彻底弄懂 Http 缓存机制 - 基于缓存策略三要素分解法

    转载:http://mp.weixin.qq.com/s/uWPls0qrqJKHkHfNLmaenQ 导语 Http 缓存机制作为 web 性能优化的重要手段,对从事 Web 开发的小伙伴们来说是必 ...

  6. 怎么使用CDR中排列对象功能

    通过将对象发送到其他对象的前面或者后面,可以更改图层或页面上对象的堆叠顺序,还可以将对象按堆叠顺序精确定位,并且可以反转多个对象的堆叠顺序.本教程将详解CorelDRAW中排列对象各按钮功能. 1. ...

  7. h5的拖放(drag和drop)

    被拖曳元素发生的事件=== ondragstart:拖拽元素开始被拖拽的时候触发 ondragend:拖拽完成后触发 目标元素发生的事件=== ondragenter:拖曳元素进入目标元素的时候触发 ...

  8. ubuntu12.10 源更新出错(sudo apt-get update)

    Ubuntu12.10 刚安装完发现vi编辑器无法正常使用,后来用sudo apt-get install vim 一直出错,搜索相关资源发现需要更新源 首先,备份一下Ubuntu 12.10 原来的 ...

  9. ecstore-lnmp环境下crontab不执行原因

    因为lnmp.org默认禁止了proc_open函数,需要开启 开启后 lnmp restart ==== contab还是用crontab -e好,有些用www用户的似乎执行不了

  10. MySQL服务 - MySQL程序的配置文件、参数、变量查看

    查看配置文件及读取顺序 MySQL的配置文件以.cnf结尾,可能会有多个,而不同版本的MySQL程序的读取配置文件的路径也都不同,要想获取MySQL读取配置文件的顺序可以通过以下指令查看: shell ...