oracle中sql分析函数
分析函数能够将复杂的需求使用简单的sql实现,而且执行效率较高。
测试环境:
SQL> select * from v$version where rownum=1;
BANNER
----------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 - Prod
create table test(name varchar2(20),val number);
insert into test values('a',1);
insert into test values('b',2);
insert into test values('c',3);
insert into test values('d',5);
insert into test values('e',7);
insert into test values('f',9);
insert into test values('g',12);
insert into test values('h',15);
SQL> select * from test;
NAME VAL
-------------------- ----------
a 1
b 2
c 3
d 5
e 7
f 9
g 12
h 15
1、连需求和
SQL> select name,val,sum(val) over(order by name desc) "连需求和" from test;
NAME VAL 连需求和
-------------------- ---------- ----------
h 15 15
g 12 27
f 9 36
e 7 43
d 5 48
c 3 51
b 2 53
a 1 54
已选择8行。
2、依据差值范围求和
SQL> select name,val,sum(val)over(order by val range between 2 preceding and 1 f
ollowing) "范围求和" from test;
NAME VAL 范围求和
-------------------- ---------- ----------
a 1 3
b 2 6
c 3 6
d 5 8
e 7 12
f 9 16
g 12 12
h 15 15
已选择8行。
SQL> select name,val,sum(val)over(order by val desc range between 2 preceding an
d 1 following ) "范围求和" from test;
NAME VAL 范围求和
-------------------- ---------- ----------
h 15 15
g 12 12
f 9 9
e 7 16
d 5 12
c 3 10
b 2 6
a 1 6
已选择8行。
3、不连续求和
SQL> select name,val,sum(val)over() "不连续求和" from test;
NAME VAL 不连续求和
-------------------- ---------- ----------
a 1 54
b 2 54
c 3 54
d 5 54
e 7 54
f 9 54
g 12 54
h 15 54
已选择8行。
求比例值:
SQL> select name,val,sum(val)over(order by val) "连续求和"
2 ,sum(val)over() "总和",100*round(val/sum(val)over(),4) "所占比例" from test
;
NAME VAL 连续求和 总和 所占比例
-------------------- ---------- ---------- ---------- ----------
a 1 1 54 1.85
b 2 3 54 3.7
c 3 6 54 5.56
d 5 11 54 9.26
e 7 18 54 12.96
f 9 27 54 16.67
g 12 39 54 22.22
h 15 54 54 27.78
已选择8行。
4、使用子分区查询
数据环境:
update test set name='a' where val<3;
update test set name='b' where val>=3 and v