- 浏览: 309899 次
- 性别:
- 来自: 深圳
文章分类
- 全部博客 (177)
- java基础空间 (12)
- java实例空间 (5)
- oracle积累空间 (22)
- JavaScript积累空间 (16)
- Spring基础空间 (10)
- Struts基础空间 (7)
- Hibernate基础空间 (2)
- java (10)
- EXT积累空间 (10)
- 电脑技术 (10)
- Flex技术点 (2)
- 金融业务 (3)
- DWR积累空间 (1)
- 常用工具记录 (7)
- 生活休闲 (25)
- web服务器 (6)
- java 报表工具 (6)
- SpringSide (1)
- 脑筋转弯 (2)
- java 错误聚集 (1)
- SqlServer集合 (6)
- DB2积累空间 (1)
- MySql记录集 (1)
- Log4j 日志使用 (1)
- 面试聚集 (2)
- jsp记录 (2)
- 原理类 (3)
- Excel VBA (1)
- ECMAScript6 (0)
最新评论
-
challengencu:
...
web服务器、应用服务器、http服务器区别 -
iris_1992:
开源报表写代码不烦吗。。。感脚现在国内报表还是帆软主导。。。
java pojo实体类做birt报表数据源 -
ab0809:
写得很好!!!!赞!
web服务器、应用服务器、http服务器区别 -
liuhu7383:
...
JavaScript动态添加Input组件 -
lovertc:
http://archive.eclipse.org/birt ...
BIRT 百灵 java web项目简单示例
引用
聚合函数RANK 和 dense_rank 主要的功能是计算一组数值中的排序值。
在9i版本之前,只有分析功能(analytic ),即从一个查询结果中计算每一行的排序值,是基于order_by_clause子句中的value_exprs指定字段的。
其语法为:
RANK ( ) OVER ( [query_partition_clause] order_by_clause )
在9i版本新增加了合计功能(aggregate),即对给定的参数值在设定的排序查询中计算出其排序值。这些参数必须是常数或常值表达式,且必须和ORDER BY子句中的字段个数、位置、类型完全一致。
其语法为:
RANK ( expr [, expr]... ) WITHIN GROUP
( ORDER BY
expr [ DESC | ASC ] [NULLS { FIRST | LAST }]
[, expr [ DESC | ASC ] [NULLS { FIRST | LAST }]]...
)
在9i版本之前,只有分析功能(analytic ),即从一个查询结果中计算每一行的排序值,是基于order_by_clause子句中的value_exprs指定字段的。
其语法为:
RANK ( ) OVER ( [query_partition_clause] order_by_clause )
在9i版本新增加了合计功能(aggregate),即对给定的参数值在设定的排序查询中计算出其排序值。这些参数必须是常数或常值表达式,且必须和ORDER BY子句中的字段个数、位置、类型完全一致。
其语法为:
RANK ( expr [, expr]... ) WITHIN GROUP
( ORDER BY
expr [ DESC | ASC ] [NULLS { FIRST | LAST }]
[, expr [ DESC | ASC ] [NULLS { FIRST | LAST }]]...
)
引用
rank()对表中的数据进行分级排序.
譬如有张学生成绩统计单的表STUDENT_RESULT
name number kemu fenshu
li 0113101 高数 90
zhang 0113098 高数 80
wang 0113077 高数 70
li 0113101 物理 80
zhang 0113098 物理 90
wang 0113077 物理 70
我如果要检索出表中高数的前两名和物理的前两名
那么可以通过使用 RANK()方法达到目的
--首先 通过kemu进行分类,然后按照fenshu降序排序
select rank() over(partition by kemu order by fenshu desc) rk,t.* from student_result t
结果
rk name number kemu fenshu
1 li 0113101 高数 90
2 zhang 0113098 高数 80
3 wang 0113077 高数 70
1 zhang 0113098 物理 90
2 li 0113101 物理 80
3 wang 0113077 物理 70
--然后,检索出rk<=2的记录,即取出前两名
select * from (select rank() over(partition by kemu order by fenshu desc) rk,t.* from student_result t) as y where y.rk<=2;
结果
rk name number kemu fenshu
1 li 0113101 高数 90
2 zhang 0113098 高数 80
1 zhang 0113098 物理 90
2 li 0113101 物理 80
dense_rank()和 rank()的用法完全相同,不同的是在出现分数相同的情况下
如
name number kemu fenshu
li 0113101 高数 80
zhang 0113098 高数 80
wang 0113077 高数 70
li 0113101 物理 80
zhang 0113098 物理 90
wang 0113077 物理 70
select rank() over(order by fenshu desc) rk,t.* from student_result t
的结果为
rk name number kemu fenshu
1 zhang 0113098 物理 90
2 li 0113101 高数 80
2 zhang 0113098 高数 80
2 li 0113101 物理 80
5 wang 0113077 高数 70
5 wang 0113077 物理 70
而select dense_rank() over(order by fenshu desc) rk,t.* from student_result t
结果为
rk name number kemu fenshu
1 zhang 0113098 物理 90
2 li 0113101 高数 80
2 zhang 0113098 高数 80
2 li 0113101 物理 80
3 wang 0113077 高数 70
3 wang 0113077 物理 70
附 row_number()的使用
select row_number() over(order by fenshu desc) rk,t.* from student_result t
rk name number kemu fenshu
1 zhang 0113098 物理 90
2 li 0113101 高数 80
3 zhang 0113098 高数 80
4 li 0113101 物理 80
5 wang 0113077 高数 70
6 wang 0113077 物理 70
fetch n rows only
取出当前记录的前多少行
如
select row_number() over(order by user_no) from user_files fetch first 5 rows only;
引用
排列(rank())函数。这些排列函数提供了定义一个集合(使用 PARTITION 子句),然后根据某种排序方式对这个集合内的元素进行排列的能力,下面以scott用户的emp表为例来说明rank over partition如何使用
1)查询员工薪水并连续求和
select deptno,ename,sal,
sum(sal)over(order by ename) sum1, /*表示连续求和*/
sum(sal)over() sum2, /*相当于求和sum(sal)*/
100* round(sal/sum(sal)over(),4) "bal%"
from emp
结果如下:
DEPTNO ENAME SAL SUM1 SUM2 bal%
---------- ---------- ---------- ---------- ---------- ----------
20 ADAMS 1100 1100 29025 3.79
30 ALLEN 1600 2700 29025 5.51
30 BLAKE 2850 5550 29025 9.82
10 CLARK 2450 8000 29025 8.44
20 FORD 3000 11000 29025 10.34
30 JAMES 950 11950 29025 3.27
20 JONES 2975 14925 29025 10.25
10 KING 5000 19925 29025 17.23
30 MARTIN 1250 21175 29025 4.31
10 MILLER 1300 22475 29025 4.48
20 SCOTT 3000 25475 29025 10.34
DEPTNO ENAME SAL SUM1 SUM2 bal%
---------- ---------- ---------- ---------- ---------- ----------
20 SMITH 800 26275 29025 2.76
30 TURNER 1500 27775 29025 5.17
30 WARD 1250 29025 29025 4.31
2)如下:
select deptno,ename,sal,
sum(sal)over(partition by deptno order by ename) sum1,/*表示按部门号分氏,按姓名排序并连续求和*/
sum(sal)over(partition by deptno) sum2,/*表示部门分区,求和*/
sum(sal)over(partition by deptno order by sal) sum3,/*按部门分区,按薪水排序并连续求和*/
100* round(sal/sum(sal)over(),4) "bal%"
from emp
结果如下:
DEPTNO ENAME SAL SUM1 SUM2 SUM3 bal%
---------- ---------- ---------- ---------- ---------- ---------- ----------
10 CLARK 2450 2450 8750 3750 8.44
10 KING 5000 7450 8750 8750 17.23
10 MILLER 1300 8750 8750 1300 4.48
20 ADAMS 1100 1100 10875 1900 3.79
20 FORD 3000 4100 10875 10875 10.34
20 JONES 2975 7075 10875 4875 10.25
20 SCOTT 3000 10075 10875 10875 10.34
20 SMITH 800 10875 10875 800 2.76
30 ALLEN 1600 1600 9400 6550 5.51
30 BLAKE 2850 4450 9400 9400 9.82
30 JAMES 950 5400 9400 950 3.27
DEPTNO ENAME SAL SUM1 SUM2 SUM3 bal%
---------- ---------- ---------- ---------- ---------- ---------- ----------
30 MARTIN 1250 6650 9400 3450 4.31
30 TURNER 1500 8150 9400 4950 5.17
30 WARD 1250 9400 9400 3450 4.31
3)如下:
select empno,deptno,sal,
sum(sal)over(partition by deptno) "deptSum",/*按部门分区,并求和*/
rank()over(partition by deptno order by sal desc nulls last) rank, /*按部门分区,按薪水排序并计算序号*/
dense_rank()over(partition by deptno order by sal desc nulls last) d_rank,
row_number()over(partition by deptno order by sal desc nulls last) row_rank
from emp
1)查询员工薪水并连续求和
select deptno,ename,sal,
sum(sal)over(order by ename) sum1, /*表示连续求和*/
sum(sal)over() sum2, /*相当于求和sum(sal)*/
100* round(sal/sum(sal)over(),4) "bal%"
from emp
结果如下:
DEPTNO ENAME SAL SUM1 SUM2 bal%
---------- ---------- ---------- ---------- ---------- ----------
20 ADAMS 1100 1100 29025 3.79
30 ALLEN 1600 2700 29025 5.51
30 BLAKE 2850 5550 29025 9.82
10 CLARK 2450 8000 29025 8.44
20 FORD 3000 11000 29025 10.34
30 JAMES 950 11950 29025 3.27
20 JONES 2975 14925 29025 10.25
10 KING 5000 19925 29025 17.23
30 MARTIN 1250 21175 29025 4.31
10 MILLER 1300 22475 29025 4.48
20 SCOTT 3000 25475 29025 10.34
DEPTNO ENAME SAL SUM1 SUM2 bal%
---------- ---------- ---------- ---------- ---------- ----------
20 SMITH 800 26275 29025 2.76
30 TURNER 1500 27775 29025 5.17
30 WARD 1250 29025 29025 4.31
2)如下:
select deptno,ename,sal,
sum(sal)over(partition by deptno order by ename) sum1,/*表示按部门号分氏,按姓名排序并连续求和*/
sum(sal)over(partition by deptno) sum2,/*表示部门分区,求和*/
sum(sal)over(partition by deptno order by sal) sum3,/*按部门分区,按薪水排序并连续求和*/
100* round(sal/sum(sal)over(),4) "bal%"
from emp
结果如下:
DEPTNO ENAME SAL SUM1 SUM2 SUM3 bal%
---------- ---------- ---------- ---------- ---------- ---------- ----------
10 CLARK 2450 2450 8750 3750 8.44
10 KING 5000 7450 8750 8750 17.23
10 MILLER 1300 8750 8750 1300 4.48
20 ADAMS 1100 1100 10875 1900 3.79
20 FORD 3000 4100 10875 10875 10.34
20 JONES 2975 7075 10875 4875 10.25
20 SCOTT 3000 10075 10875 10875 10.34
20 SMITH 800 10875 10875 800 2.76
30 ALLEN 1600 1600 9400 6550 5.51
30 BLAKE 2850 4450 9400 9400 9.82
30 JAMES 950 5400 9400 950 3.27
DEPTNO ENAME SAL SUM1 SUM2 SUM3 bal%
---------- ---------- ---------- ---------- ---------- ---------- ----------
30 MARTIN 1250 6650 9400 3450 4.31
30 TURNER 1500 8150 9400 4950 5.17
30 WARD 1250 9400 9400 3450 4.31
3)如下:
select empno,deptno,sal,
sum(sal)over(partition by deptno) "deptSum",/*按部门分区,并求和*/
rank()over(partition by deptno order by sal desc nulls last) rank, /*按部门分区,按薪水排序并计算序号*/
dense_rank()over(partition by deptno order by sal desc nulls last) d_rank,
row_number()over(partition by deptno order by sal desc nulls last) row_rank
from emp
发表评论
-
oracle 查询表的基本信息
2010-12-16 21:19 1445查询某前缀的所有表; select * from tab wh ... -
Oracle用imp导入 用户表时选择表空间的问题
2010-12-16 18:04 8537引用【imp导入 用户表时 ... -
oracle DBLink
2010-11-18 21:09 2634一、错误 ORA-02019:connection descr ... -
oracle sql实现 累乘
2010-11-06 21:21 2528引用 方法一: 使用窗 ... -
cursor 与refcursor及sys_refcursor的区别
2010-10-31 17:47 3859引用一、显式cursor 显式是相对与隐式cursor而言 ... -
PL/SQL开发中动态SQL的使用方法
2010-10-31 17:44 1001引用在PL/SQL开发过程中,使用SQL,PL/SQL可以实现 ... -
oracle 同义词 优点
2010-10-29 15:28 1686Oracle数据库中提供 ... -
oracle 10g正则表达式
2010-10-07 13:54 1176引用 oracle的正则表达式(10g才可以用) oracl ... -
some all any用法
2010-09-26 16:57 924引用 用some,any和all对子 ... -
忘记oracle密码
2010-06-28 17:41 8341、控制面板->管理工具->服务 中打开 ... -
oracle10g listener.ora配置文件
2010-06-24 15:43 2394# listener.ora Network Config ... -
网址集
2010-06-24 14:08 723imp/exp详解: http://www.360doc.co ... -
oracle函数积累
2010-05-14 13:50 925引用时间日期:http://hi.baidu.com/wuhu ... -
NVL,NVL2,NULLIF,COALESCE
2010-05-14 13:41 2492Oracle中一类函数是通用函数。主要有:NVL,NVL2 ... -
oracle基础
2010-03-16 21:08 830一、字符说明: 1.char 定长 最大2000字符 ... -
SQL 连接 JOIN 例解(左连接,右连接,全连接,内连接,交叉连接,自连接)
2010-03-15 19:28 694现在在这写写关于它们的作用假设有如下表:一个为投票主表,一个为 ... -
oracle的连接方式讨论
2010-03-15 18:26 1092引用 这一阶段在做数据库的移植。(sql server 200 ... -
oracle的工作机制
2010-03-15 17:31 626引用 ORACLE的工作机制-1 我们从一个用户请 ... -
sql查询总结
2010-03-15 17:27 1530引用 sql查询方式总结 简单查询、选择行查询、生成总结查询 ... -
数据库的优化
2010-03-15 17:24 759引用 优化策略 为了保证Oracle数据库运行在最佳 ...
相关推荐
本文主要介绍Oracle中rank,over partition函数的用法,希望对大家有所帮助。
一、rank()/dense_rank() over(partition by …order by …) 现在客户有这样一个需求,查询每个部门工资最高的雇员的信息,相信有一定oracle应用知识的同学都能写出下面的SQL语句: select e.ename, e.job, e.sal, ...
在oracle中,有rank,dense_rank,row_number,以及分组排名partition。 说明: rank:排名会出现并列第n名,它之后的会跳过空出的名次,例如:1,2,2,4 dense_rank:排名会出现并列第n名,它之后的名次为n+1,例如:1,2,...
聚合函数可以是:sum,count,avg,max,min,first_value,last_value,rank,dense_rank ,row_number, ratio_to_report Over不能单独使用,用来制定数据窗口大小 Partition by表示分类数据集合,在此集合上的运算 Order by...
ROW_NUMBER () OVER([partition_clause] order_by_clause) dense_rank在做排序时如果遇到列有重复值,则重复值所在行的序列值相同,而其后的序列值依旧递增,rank则是重复值所在行的序列值相同,但其后的序列值从...
dense_rank ( ) over ([partition by col] order by col ) rownumber ( ) over ( [partition by col] order by col ) rank() 是排名的函数,该函数组内排序后会进行跳号,分数相同的作为并列。 dense_rank()
select * from (select deptno,ename,sal,dense_rank() over(partition by deptno order by sal desc) a from scott.emp) where a<=3 order by deptno asc,sal desc ; 结果: –rank()分析函数(运行结果与上语句...
在前面《Oracle开发之分析函数(Rank、Dense_rank、row_number)》一文中,我们已经知道了如何为一批记录进行全排列、分组排列。假如被排列的数据中含有空值呢? 代码如下:SQL> select region_id, customer_id, ...
row_number()over(partition by col1 order by col2)表示根据col1分组,在分组内部根据col2排序,而此函数计算的值就表示每组内部排序后的顺序编号(组内连续的唯一的)。 与rownum的区别在于:使用rownum进行排序的...
20.oracle8中扩充了group by rollup和cube的操作。有时候省了你好多功夫的。 下面的语句可以进行总计 select region_code,count(*) from aicbs.acc_woff_notify group by rollup(region_code); <2> 对第1个字段...