人人范文网 范文大全

oracle plsql 开窗函数over学习总结

发布时间:2020-03-02 03:22:12 来源:范文大全 收藏本文 下载本文 手机版

连续求和与求总和的区别 D 为天,S 为销售业绩为每天计算销售总额。

SELECTSUM(s) OVER (ORDERBY d),

SUM(s) OVER ()

FROM (SELECT\'A\'\"A\",1 D, 20 SFROM DUAL

UNIONALL

SELECT\'A\'\"A\",2 D, 15 SFROM DUAL

UNIONALL

SELECT\'A\'\"A\",3 D, 14 SFROM DUAL

UNIONALL

SELECT\'A\'\"A\",4 D, 18 SFROM DUAL

UNIONALL

SELECT\'A\'\"A\",5 D, 30 SFROM DUAL);

各种求和举例 CREATE TABLETEST_ZHUXP(DEPTNOVARCHAR2(10), ENAME VARCHAR2(10), SAL VARCHAR2(10));--部门姓名薪水

SELECTtest_zhuxp.*,

sum(sal) over (partitionbydeptnoorderbyename) 部门连续求和,--各部门的薪水\"连续\"求和

sum(sal) over (partitionbydeptno) 部门总和,-- 部门统计的总和,同一部门总和不变

100*round(sal/sum(sal) over (partitionbydeptno),4) \"部门份额(%)\", sum(sal) over (orderbydeptnoDESC,ename) 连续求和, --所有部门的薪水\"连续\"求和

sum(sal) over () 总和-- 此处sum(sal) over () 等同于sum(sal),所有员工的薪水总和

100*round(sal/sum(sal) over (),4) \"总份额(%)\"

FROMtest_ZHUXP

注意求和后可以排序不影响结果

SELECT DEPTNO,

ENAME,

SAL,

SUM(SAL) OVER(PARTITIONBY DEPTNO ORDERBY DEPTNO DESC, SAL DESC) 部门连续求和,

SUM(SAL) OVER(ORDERBY DEPTNO DESC, SAL DESC)公司连续求和

FROM TEST_ZHUXP

排序

1.在求第一名成绩的时候,不能用row_number(),因为如果同班有两个并列第一,row_number()只返回一个结果

2.rank()和dense_rank()的区别是:

rank()是跳跃排序,有两个第二名时接下来就是第四名dense_rank()l是连续排序,有两个第二名时仍然跟着第三名

SELECTt.*,

RANK()OVER(PARTITIONBYCLASSORDERBY S DESC),

dense_rank()OVER(PARTITIONBYCLASSORDERBY S DESC),

ROW_NUMBER()OVER(PARTITIONBYCLASSORDERBY S DESC)

FROM (SELECT\'a\' \"NAME\",1 \"CLASS\",80 \"S\"FROM DUAL

UNIONALL

SELECT\'b\' \"NAME\",1 \"CLASS\",89 \"S\" FROM DUAL

UNIONALL

SELECT\'c\' \"NAME\",1 \"CLASS\",89 \"S\" FROM DUAL

UNIONALL

SELECT\'e\' \"NAME\",3 \"CLASS\",100 \"S\" FROM DUAL

UNIONALL

SELECT\'f\' \"NAME\",3 \"CLASS\",100 \"S\" FROM DUAL

UNIONALL

SELECT\'g\' \"NAME\",3 \"CLASS\",79 \"S\" FROM DUAL) t

统计

和group by的区别是可以看到每一行数据的所有信息

注意加NAME后的区别

SELECTt.*,

SUM(1)OVER(PARTITIONBYCLASSORDERBYCLASS/*NAME*/)

FROM (SELECT\'a\' \"NAME\",1 \"CLASS\",80 \"S\"FROM DUAL

UNIONALL

SELECT\'b\' \"NAME\",1 \"CLASS\",89 \"S\" FROM DUAL

UNIONALL

SELECT\'c\' \"NAME\",1 \"CLASS\",89 \"S\" FROM DUAL

UNION ALL

SELECT\'e\' \"NAME\",1 \"CLASS\",100 \"S\" FROM DUAL

UNION ALL

SELECT\'f\' \"NAME\",3 \"CLASS\",100 \"S\" FROM DUAL

UNION ALL

SELECT\'g\' \"NAME\",3 \"CLASS\",79 \"S\" FROM DUAL) t

开窗函数

开窗函数

开窗函数指定了分析函数工作的数据窗口大小,这个数据窗口大小可能会随着行的变化而变化,举例如下:

1:

over(orderby xxx)按照xxx排序进行累计,order by是个默认的开窗函数

over(partitionbyxxx)按照部门分区

2:

over(orderby salary rangebetween5precedingand5following)

每行对应的数据窗口是之前行幅度值不超过5,之后行幅度值不超过5

例如:对于以下列

aa

6

7

9

sum(aa)over(orderbyaarangebetween2precedingand2following)

得出的结果是

AASUM

110

214

214

214

318

418

522

618

722

99

就是说,对于aa=5的一行,sum为5-1

对于aa=2来说,sum=1+2+2+2+3+4=14;

又如对于aa=9,9-1

3:其它:

over(orderby salary rowsbetween2precedingand4following)

每行对应的数据窗口是之前2行,之后4行

4:下面三条语句等效:

over(orderby salary rowsbetweenunboundedprecedingandunboundedfollowing) 每行对应的数据窗口是从第一行到最后一行,等效:

over(orderby salary

rangebetweenunboundedprecedingandunboundedfollowing)

等效over(partitionbynull)

任意删除重复行

在这个表中如果cla与score相同,就考虑这行数据多余,删除多余行,就随便保留一行。

NAMECLASSSCORE

---------- ---------- ----------

1.ff197

2.gg189

3.ll196

4.jj289

5.oo287

6.ii198

7.kk293

8.uu397

9.rr395

10.ee392

11.yy290

12.mm4100

13.nn498

14.pp198

15.fft197

16.ggt189

17.oot287

18.kkt293

19.ffff197

SQL> delete from c_score t where rowid in(select rowid from (select rowid ,row_number() over (partition by cla,score order by cla)dup_num from c_score)t where t.dup_num>1);

外墙开窗申请

开窗关窗例文

函数总结

Mind over Time

Starting Over Again

Over the last month

Android的getSystemService函数学习总结

山东卷:开窗看问题

EXCEL函数总结

MATLAB函数总结

oracle plsql 开窗函数over学习总结
《oracle plsql 开窗函数over学习总结.doc》
将本文的Word文档下载到电脑,方便编辑。
推荐度:
点击下载文档
点击下载本文文档