oracle中over()分析函数的用法
摘自: http://www.poluoluo.com/jzxy/201004/81921.html
百度文库也记载了oracle中over()分析函数的用法
在泡坛子的时候中无意中发现了这个函数,才知道oracle分析函数是如此的强大,其中over() 函数的用法又尤为的特别,所以将自己的研究结果记录一下。
个人理解:over() 函数 是对 分析函数的一种条件解释,直接点就是 给分析函数加条件吧。
在网上看见比较常用的就是 与 sum()、rank() 函数使用。接下来就用分析下两种函数结合over的用法。
以下测试使用的orace默认的 scott用户下的emp表数据。
1.sum()结合over()
Sql代码
select a.empno as 员工编号
,a.ename as 员工姓名
,a.deptno as 部门编号
,a.sal as 薪酬
,sum(sal) over (partition by deptno) 按部门求薪酬总和
from scott.emp a;
此段sql 执行的结果为:
员工编码 员工姓名 部门编号 薪酬 按部门求薪酬总和
7934 MILLER 10 1300 8750
7782 CLARK 10 2450 8750
7839 KING 10 5000 8750
7369 SMITH 20 800 10875
7876 ADAMS 20 1100 10875
7566 JONES 20 2975 10875
7788 SCOTT 20 3000 10875
7902 FORD 20 3000 10875
7900 JAMES 30 950 9400
7654 MARTIN 30 1250 9400
7521 WARD 30 1250 9400
7844 TURNER 30 1500 9400
7499 ALLEN 30 1600 9400
7698 BLAKE 30 2850 9400
可以从结果上看到sum()函数对部门区分进行了求和统计。其中“partition by”官方点的说法叫做"分区",其实就是统计的范围条件。
下面在给把上面的sql语句改造下 给 over() 函数加上 “order by sal” 会看到一个更过瘾的效果:
Sql代码
select a.empno as 员工编号
,a.ename as 员工姓名
,a.deptno as 部门编号
,a.sal as 薪酬
,sum(sal) over (partition by deptno) 按部门求薪酬总和
,sum(sal) over (partition by deptno order by sal) 按部门累计薪酬
from scott.emp a;
结果为:
员工编码 员工姓名 部门编号 薪酬 按部门求薪酬总和 按部门累计薪酬
7934 MILLER 10 1300 8750 1300
7782 CLARK 10 2450 8750 3750
7839 KING 10 5000 8750 8750
7369 SMITH 20 800 10875 800
7876 ADAMS 20 1100 10875 1900
7566 JONES 20 2975 10875 4875
7788 SCOTT 20 3000 10875 10875
7902 FORD 20 3000 10875 10875
7900 JAMES 30 950 9400 950
7654 MARTIN 30 1250 9400 3450
7521 WARD 30 1250 9400 3450
7844 TURNER 30 1500 9400 4950
7499 ALLEN 30 1600 9400 6550
7698 BLAKE 30 2850 9400 9400
从结果中可以看的 加了 “order by”后对 统计进行一个累加,这里个人理解为对统计范围规定了个统计顺利,一步一步的统计。
注:此sql语句结尾处不要加“order by”,应为使用的分析函数的(partition by deptno order by sal)
里已经有排序的语句了,如果再在句尾添加排序子句,一致倒罢了,不一致,结果就令人费解了。
2.rank()结合over()
rank函数是分级函数,这个函数必须与 over 函数使用,否则会报一个"缺少窗口函数的错"。我测试sql如下:
Sql代码
select a.empno as 员工编号,
a.sal as 薪资,
a.job as 岗位,
rank() OVER(partition by a.job ORDER BY a.sal desc) as 岗位薪资等级
from scott.emp a;
查询结果为:
员工编号 薪资 岗位 等级
7902 3000 ANALYST 1
7788 3000 ANALYST 1
7934 1300 CLERK 1
7876 1100 CLERK 2
7900 950 CLERK 3
7369 800 CLERK 4
7566 2975 MANAGER 1
7698 2850 MANAGER 2
7782 2450 MANAGER 3
7839 5000 PRESIDENT 1
7499 1600 SALESMAN 1
7844 1500 SALESMAN 2
7654 1250 SALESMAN 3
7521 1250 SALESMAN 3
oracle中over()分析函数的用法相关推荐
- Oracle中游标Cursor基本用法详解
这篇文章主要介绍了Oracle中游标Cursor基本用法详解,还是比较全面的,具有一定参考价值,需要的朋友可以了解下. 查询 SELECT语句用于从数据库中查询数据,当在PL/SQL中使用SELECT ...
- Oracle中ROW_NUMBER() OVER()函数用法
Oracle中ROW_NUMBER() OVER()函数用法 1. 说明:ROW_NUMBER() OVER() 函数的作用:分组排序 2. 原理: row_number() over() 函数,ov ...
- oracle中的merge into用法解析
oracle中的merge into用法解析 merge into的形式 MERGE INTO [target-table] A USING [source-table sql] B ON([cond ...
- oracle中的to_number,Oracle中to_number()函数的用法
to_number()函数是oracle中常用的类型转换函数之一,是将一些处理过的按一定格式编排过的字符串变回数值型的格式. 1.to_number()函数可以将char或varchar2类型的str ...
- Oracle中to_char()函数的用法
Oracle中to_char()函数的用法 日期转换: to_char(date,'格式') select to_date('2005-01-01 ','yyyy-MM-dd') from dual; ...
- oracle to_char函数格式,oracle 中to_char函数的用法
一.日期格式转换 to_char(date,'格式'); select to_date('2005-01-01 ','yyyy-MM-dd') from dual; select to_char(sy ...
- Oracle中add_months()函数的用法
Oracle中add_months()函数的用法 查询当前时间n个月以前的时间: select add_months(sysdate,-n) from dual; 查询当前时间n个月之后的时间: se ...
- oracle中rollback用法,Oracle中SAVEPOINT和ROLLBACK用法
savepoint是事务内部允许部分rollback的标志符.因为事务中对记录做了修改,我们可以在事务中创建savepoint来标识不同的点.如果遇到错误,就可以rollback到不同的点或直接回来事 ...
- oracle分类函数总结,oracle中分组排序函数用法
项目开发中,我们有时会碰到需要分组排序来解决问题的情况,如:1.要求取出按field1分组后,并在每组中按照field2排序:2.亦或更加要求取出1中已经分组排序好的前多少行的数据 这里通过一张表的示 ...
最新文章
- NodeJs端口被占用的情况
- linux root------系统排错
- 24分钟学会用JMock进行单元测试
- EJB继承与Java继承不同
- opencv双目视觉标定、匹配和测量 (附代码)
- matlab样条插值如何用,三次样条插值matlab实现
- 特斯拉股价创新高 马斯克嘚瑟:股价真高 哈哈!
- Android 开发之ViewPage官方文档学习笔记
- Oracle零碎要点---多表联合查询,收集数据库基本资料
- 阵列信号处理——求根MUSIC算法(Root MUSIC)
- #C语言或C++中强大的图形库——easyx
- 三四五线城市商机无限,但创业更适合在一线城市
- 传奇私服服务器修改沙巴克时间,新手教程:如何修改沙巴克名称
- NI PXI-6221(16路模拟输入)校准小记
- 一个好的浏览器是多么重要,强烈推荐一个好用的浏览器.........
- -- 27、 查询出只有两门课程的全部学生的学号和姓名(不重点)(自己做出)
- uboot分析:uboot的启动过程分析
- MYSQL JDBC快速查询响应的方法,快速返回机制的实现
- DRAM BRANK
- Name or service not known, ping域名报错
热门文章
- 获取选中_【字节】如何实现选中复制的功能
- 时间序列的预处理之纯随机性检验
- java线程池执行器_Java线程池ThreadPoolExecutor的使用
- 【youcans 的 OpenCV 例程200篇】157. 霍夫变换直线检测
- Python 小白从零开始 PyQt5 项目实战(5)布局管理
- mysql如何查看表拥有的键_如何查看表或列的所有外键?
- 商城是用jsp还是php,建设网上购物网站使用JSP系统还是ASP系统
- c++矩阵连乘的动态规划算法并输出_你在Java中用过动态规划吗?
- python crm_Python CRM项目一
- 哈夫曼编码和带权路径计算