首先来看排序函数:rank dense_rank row_number。
在9i版本之前,只有分析功能(analytic),即从一个查询结果中计算每一行的排序值,是基于order_by_clause子句中的value_exprs指定字段的。 窗口生成语句用以定义滑动或固定数据窗口,分析函数在分组内进行分析。该语句能够对分组中任意定义的滑动或固定窗口进行计算。其语法为:
RANK ( ) OVER (< query_partition_clause] >
区别在于:dense_rank 相同数值排相同位,并且连续排名不跳过这个排名,rank相同的数值排相同位,并且后面的数据就会直接跳过这个排名,row_number()一定是不同的序号,哪怕是两个数据完全相同,这个特性在我们想找出对应每个条件的唯一记录的时候有很大用处。
SQL> SELECT EMP.*, rank() over (order by SALARY) rank1
,Dense_rank() over (order by SALARY) dense,ROW_NUMBER() over (order by SALARY) rown
FROM EMP;
EMPID SALARY DEPID rank1 dense rown
---------- ---------- ---------- ---------- ----------------
1 100 1 1 1 1
5 100 2 1 1 2
7 120 2 3 2 3
4 150 1 4 3 4
2 200 1 5 4 5
6 200 2 5 4 6
3 200 1 5 4 7
已选择7行。
上面的排序都是对表中全部记录进行排序,如果使用partition by,就是分组排序,partition by DEPID就是分部门排序。
SQL> SELECT EMP.*, RANK() over (PARTITION BY DEPID order by SALARY) rank
,ROW_NUMBER() over (PARTITION BY DEPID order by SALARY) rown FROM EMP;
EMPID SALARY DEPID RANK rown
---------- ---------- ---------- -------- --------------
1 100 1 1 1
4 150 1 2 2
3 200 1 3 3
2 200 1 3 4
5 100 2 1 1
7 120 2 2 2
6 200 2 3 3
已选择7行。
使用rank获得 DEPID字段中的重复数据,同时又可以选择表中的其他字段。
select e1.*
from (
SELECT EMP.*, RANK() over (PARTITION BY DEPID order by rownum) rank FROM EMP)E1
where e1.rank = 1;
说明:RANK() OVER (PARTITION BY depid order by rownum) 得到按照rownum排序后depid字段中重复数据每行为第几次出现,取第一次出现的所有数据,就可以排除depid的重复数据,和distinct和group by比的好处是,他同时还可以选出表中的其他字段,结果集不受影响。
在9i版本新增加了合计功能(aggregate),即对给定的参数值在设定的排序查询中计算出其排序值。这些参数必须是常数或常值表达式,且必须和ORDER BY子句中的字段个数、位置、类型完全一致。多数是由已知值查看其排序值。
其语法为:
RANK ( expr [, expr]... ) WITHIN GROUP
( ORDER BY
expr [ DESC | ASC ] [NULLS { FIRST | LAST }]
[, expr [ DESC | ASC ] [NULLS { FIRST | LAST }]]...
)
SQL>SELECT RANK(20,3000) WITHIN GROUP (ORDER BY deptno,sal) "Rank" FROM emp;
Rank
----------
7
分析功能:计算出数值20,3000在Order By deptno,sal下的排序值, 也就是deptno =20,sal=3000在排序以后的位置。
取前三名的分数Select * from (select name,class,subject,rank()over(partition by class order by subject desc) rank1 from t2)
Where rank1<=3;
注意:
1.在求前三名成绩的时候,不能用row_number(),因为如果同班有两个并列第一,row_number()返回的结果少。
NULLS FIRST/LAST是去除空值不确定性的因素。指定是否返回包含空值的行数。这些空值会出现在开始或者最后,在排序的时候。NULLS LAST是默认的为升序使用的。NULLS FIRST 默认为降序使用。如果想控制值为null的行显示位置,nulls first|last参数就能派上用场了。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/7177735/viewspace-710098/ ,如需转载,请注明出处,否则将追究法律责任。