




已阅读5页,还剩8页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Oracle统计分析函数集,over(partition by.) 的运用oracle的分析函数over 及开窗函数一:分析函数overOracle从8.1.6开始提供分析函数,分析函数用于计算基于组的某种聚合值,它和聚合函数的不同之处是对于每个组返回多行,而聚合函数对于每个组只返回一行。 下面通过几个例子来说明其应用。 1:统计某商店的营业额。 date sale 1 20 2 15 3 14 4 18 5 30 规则:按天统计:每天都统计前面几天的总额 得到的结果: DATE SALE SUM - - - 1 20 20 -1天 2 15 35 -1天2天 3 14 49 -1天2天3天 4 18 67 . 5 30 97 . 2:统计各班成绩第一名的同学信息 NAME CLASS S - - - fda 1 80 ffd 1 78 dss 1 95 cfe 2 74 gds 2 92 gf 3 99 ddd 3 99 adf 3 45 asdf 3 55 3dd 3 78 通过: - select * from ( select name,class,s,rank()over(partition by class order by s desc) mm from t2 ) where mm=1 - 得到结果: NAME CLASS S MM - - - - dss 1 95 1 gds 2 92 1 gf 3 99 1 ddd 3 99 1 注意: 1.在求第一名成绩的时候,不能用row_number(),因为如果同班有两个并列第一,row_number()只返回一个结果 2.rank()和dense_rank()的区别是: -rank()是跳跃排序,有两个第二名时接下来就是第四名 -dense_rank()l是连续排序,有两个第二名时仍然跟着第三名 3.分类统计 (并显示信息) A B C - - - m a 2 n a 3 m a 2 n b 2 n b 1 x b 3 x b 2 x b 4 h b 3 select a,c,sum(c)over(partition by a) from t2 得到结果: A B C SUM(C)OVER(PARTITIONBYA) - - - - h b 3 3 m a 2 4 m a 2 4 n a 3 6 n b 2 6 n b 1 6 x b 3 9 x b 2 9 x b 4 9 如果用sum,group by 则只能得到 A SUM(C) - - h 3 m 4 n 6 x 9 无法得到B列值 select * from test数据:A B C 1 1 1 1 2 2 1 3 3 2 2 5 3 4 6-将B栏位值相同的对应的C 栏位值加总select a,b,c, SUM(C) OVER (PARTITION BY B) C_Sumfrom testA B C C_SUM 1 1 1 1 1 2 2 7 2 2 5 7 1 3 3 3 3 4 6 6-如果不需要已某个栏位的值分割,那就要用 nulleg: 就是将C的栏位值summary 放在每行后面select a,b,c, SUM(C) OVER (PARTITION BY null) C_Sumfrom testA B C C_SUM 1 1 1 17 1 2 2 17 1 3 3 17 2 2 5 17 3 4 6 17求个人工资占部门工资的百分比SQL select * from salary;NAME DEPT SAL- - -a 10 2000b 10 3000c 10 5000d 20 4000SQL select name,dept,sal,sal*100/sum(sal) over(partition by dept) percent from salary;NAME DEPT SAL PERCENT- - - -a 10 2000 20b 10 3000 30c 10 5000 50d 20 4000 100二:开窗函数 开窗函数指定了分析函数工作的数据窗口大小,这个数据窗口大小可能会随着行的变化而变化,举例如下: 1: over(order by salary) 按照salary排序进行累计,order by是个默认的开窗函数 over(partition by deptno)按照部门分区2:over(order by salary range between 5 preceding and 5 following) 每行对应的数据窗口是之前行幅度值不超过5,之后行幅度值不超过5 例如:对于以下列 aa 1 2 2 2 3 4 5 6 7 9 sum(aa)over(order by aa range between 2 preceding and 2 following) 得出的结果是 AA SUM - - 1 10 2 14 2 14 2 14 3 18 4 18 5 22 6 18 7 22 9 9 就是说,对于aa=5的一行 ,sum为 5-1=aa=5+2 的和 对于aa=2来说 ,sum=1+2+2+2+3+4=14 ; 又如 对于aa=9 ,9-1=aa select n1,v1,nid,sum(nid) over(order by nid) as sum 2 from t1; N1 V1 NID SUM- - - - 1 aa 61 61 2 aa 62 123 3 aa 63 186 4 aa 64 250取nid列的累积和,即下面以emp表为例的按部门“连续”求总和=按v1分组取nid的和SQL select v1,sum(nid) over (partition by v1 order by v1) as sum_nid from t1;V1 SUM_NID- -aa 187aa 187aa 187bb 83按v1分组取nid的和,并重复行只显示一行SQL select distinct * from (select v1,sum(nid) over (partition by v1) as sum_nid from t1);V1 SUM_NID- -aa 187bb 83=再以emp为例使用子分区查出各部门薪水连续的总和。注意按部门分区 over(.)条件的不同sum(sal) over (partition by deptno order by ename) 按部门“连续”求总和sum(sal) over (partition by deptno) 按部门求总和sum(sal) over (order by deptno,ename) 不按部门“连续”求总和sum(sal) over () 不按部门,求所有员工总和,效果等同于sum(sal)。sql break on deptno skip 1 - 为效果更明显,把不同部门的数据隔段显示。SQL select deptno,ename,sal, 2 sum(sal) over (partition by deptno order by ename) 部门连续求和, 3 sum(sal) over (partition by deptno) 部门总和, 4 100*round(sal/sum(sal) over (partition by deptno),4) 部门份额, 5 sum(sal) over () 总和, 6 sum(sal) over (order by deptno,ename) 连续求和, 7 100*round(sal/sum(sal) over (),4) 总份额 8 from emp; DEPTNO ENAME SAL 部门连续求和 部门总和 部门份额 总和 连续求和 总份额- - - - - - - - - 10 CLARK 2450 2450 8750 28 29025 2450 8.44 KING 5000 7450 8750 57.14 29025 7450 17.23 MILLER 1300 8750 8750 14.86 29025 8750 4.48 20 ADAMS 1100 1100 10875 10.11 29025 9850 3.79 FORD 3000 4100 10875 27.59 29025 12850 10.34 JONES 2975 7075 10875 27.36 29025 15825 10.25 SCOTT 3000 10075 10875 27.59 29025 18825 10.34 SMITH 800 10875 10875 7.36 29025 19625 2.76 30 ALLEN 1600 1600 9400 17.02 29025 21225 5.51 BLAKE 2850 4450 9400 30.32 29025 24075 9.82 JAMES 950 5400 9400 10.11 29025 25025 3.27 MARTIN 1250 6650 9400 13.3 29025 26275 4.31 TURNER 1500 8150 9400 15.96 29025 27775 5.17 WARD 1250 9400 9400 13.3 29025 29025 4.31已选择14行。综合的例子,求和规则有按部门分区的,有不分区的例子SQL select deptno,ename,sum(sal) over(partition by deptno order by sal) as sum_sal, 2 sum(sal) over(order by deptno,sal) as sum_dept_sal 3 from emp; DEPTNO ENAME SUM_SAL SUM_DEPT_SAL- - - - 10 MILLER 1300 1300 CLARK 3750 3750 KING 8750 8750 20 SMITH 800 9550 ADAMS 1900 10650 JONES 4875 13625 SCOTT 10875 19625 FORD 10875 19625 30 JAMES 950 20575 WARD 3450 23075 MARTIN 3450 23075 TURNER 4950 24575 ALLEN 6550 26175 BLAKE 9400 29025已选择14行。来一个逆序的,即部门从大到小排列,部门里各员工的薪水从高到低排列,累计和的规则不变。SQL select deptno,ename,sal, 2 sum(sal) over (partition by deptno order by deptno desc,sal desc) as sum_sal_order, 3 sum(sal) over (order by deptno desc,sal desc) as sum 4 from emp; DEPTNO ENAME SAL SUM_SAL_ORDER SUM- - - - - 30 BLAKE 2850 2850 2850 ALLEN 1600 4450 4450 TURNER 1500 5950 5950 WARD 1250 8450 8450 MARTIN 1250 8450 8450 JAMES 950 9400 9400 20 SCOTT 3000 6000 15400 FORD 3000 6000 15400 JONES 2975 8975 18375 ADAMS 1100 10075 19475 SMITH 800 10875 20275 10 KING 5000 5000 25275 CLARK 2450 7450 27725 MILLER 1300 8750 29025已选择14行。Oracle - over函数作用 over()函数是Oracle的分析函数,其语法如下:函数名( 参数 ) over( 分区子句 排序子句 滑动窗口子句 ) 分区子句类似于聚组函数所需要的group by,排序子句可看成是SQL语句中的order by,只不过在此语句中还可指定null值排前(nulls first)还是排后(nulls last)。滑动窗口语句就比较复杂,参见manual中的sql reference,总体说明可见:/docs/cd/B10501_01/server.920/a96540/functions2a.htm#81409示例1:剔除重复记录 表temp_b的记录:执行如下SQL语句:select * from ( select city_name, city_code, prov_id, row_number() over(partition by city_name order by 1) r from temp_a) where r = 1;剔除表temp_a中city_name相同的记录示例2:分组排序 成绩表的所有记录如下:执行如下SQL语句:select student_name, class, score, dense_rank() over(partition by class order by score desc) 名次 from temp_b;分班级按成绩排名次排序如下:提示:函数dense_rank()是连续排序,有两个第二名时仍然跟着第三名。函数rank()是跳跃排序,有两个第二名时接下来就是第四名(同
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 钼铁冶炼工入职考核试卷及答案
- 疏浚管线工职业考核试卷及答案
- 高空作业机械装配调试工招聘考核试卷及答案
- 阳极炉工前沿技术考核试卷及答案
- 密闭鼓风炉备料工培训考核试卷及答案
- 9.2 正弦定理与余弦定理的应用教学设计-2025-2026学年高中数学人教B版2019必修第四册-人教B版2019
- 速冻果蔬制作工技能巩固考核试卷及答案
- 第一学期语文教研组学生个性发展计划
- 羽毛球拍制作工前沿技术考核试卷及答案
- 国宝大熊猫故事续写作文三年级范文
- 风电并购协议书
- 企业微信在电脑上使用课件功能
- 2025-2030年中国天然冰片行业市场现状分析及竞争格局与投资发展研究报告
- 成考学位日语试题及答案
- 2024年重庆机场集团有限公司招聘笔试真题
- 健康体检信息系统软件需求规格说明书
- 微生物组与卵巢癌关联-全面剖析
- 2025中国新型储能行业发展白皮书
- 《投标文件产品质量保证措施:方案与实施》
- 五金零售行业O2O模式研究-全面剖析
- 2025年乡村医生考试题库:常见疾病诊疗与社区医疗管理试题试卷
评论
0/150
提交评论