Oracle 分析函数

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

--每一个值占总数的百分比

SELECT x, y, z,round(z/sum(z) over()*100,2)||'%' propn , sum(z) over() sum FROM t1;

--每一个值占分组的百分比

SELECT x, y, z,round(z/sum(z) over(partition by x)*100,2)||'%' propn , sum(z) over(partition by x) sum FROM t1;

--以x分区,按y排序累计取和

SELECT x, y, z, sum(z) over(partition by x order by y desc) sum FROM t1;

--以x分区,按z降序,每个分区取前两个

select *

from (select x,

y,

z,

s,

dense_rank() over(partition by x order by z desc) r1,

rank() over(partition by x order by z desc) r2,

count(*) over(partition by x order by z desc, y range unbounded preceding) r3 from (SELECT x, y, z, sum(z) over(partition by x) s

FROM t1

order by 4 desc, z desc))

where r3 < 3

order by z desc, x

/*

语法:

function_name(,,...)

over()

函数名(参数)

over关键字( :over关键字用于区分普通聚集函数和分析函数,必选

partition子句:将结果集分区分组,当分区变化时重新计数

ORDER BY子句:数据在分区内是如何存储的,会直接影响一些分析函数

windowing子句:一个定义变化或固定的数据窗口方法,用于分析函数计数

range窗口:根据where条件将行集中到一起,如range 5 preceding,产生一个滑动窗口,在分区内拥有所有当前行以前的5行集合,只能用于数值和日期,order by只能有一列

order by sal range 1000 preceding

row窗口:是物理单元,包括在窗口中的行的物理数

order by row 5 preceding

包含6行,当前行以及前面的5行,“前面”是指order by后的

)

*/

select deptno,

empno,

sum(sal) over(partition by deptno) dept_sum, --部门工资总和

sum(sal) over() all_sum, --全部工资总和

sum(sal) over(partition by deptno order by sal) running_sum, --按工资排序累加

row_number() over(partition by deptno order by sal) dept_seq --部门内工资排名

from emp;

select deptno,

ename,

sal,

--开窗子句,必须有order by,可以通过范围range、与当前行的偏移量来确定开窗sum(sal) over(partition by deptno order by ename rows 2 preceding) sliding_total,

--默认的开窗范围是一个固定范围,从分区第一行到当前行

sum(sal) over(partition by deptno order by ename range unbounded preceding) sliding_total

from emp

order by deptno, ename;

--range开窗子句

select ename,

sal,

hiredate,

hiredate - 100 windowtop,

first_value(ename) over(order by hiredate asc range 100 preceding) ename_prec,

first_value(hiredate) over(order by hiredate asc range 100 preceding) hiredate_prec from emp

order by hiredate asc;

--row开窗

select ename,

sal,

hiredate,

first_value(ename) over(order by hiredate asc rows 5 preceding) ename_prec,

first_value(hiredate) over(order by hiredate asc rows 5 preceding) hiredate_prec

from emp

order by hiredate asc;

--分析函数

--cume_dist:返回一行在组的位置,大于0,小于等于1,1/3,2/3/,3/3,必须order by

--percent_rank:与cume_dist相似,对一组内特定行来说,计算行号时先减1,然后除以n-1,n为组内所有行数,如果排序重复则序号相同

select deptno,

ename,

sal,

cume_dist() over(partition by deptno order by sal),

percent_rank() over(partition by deptno order by sal)

相关文档
最新文档