Oracle 分析函数
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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)