ITPub博客

首页 > Linux操作系统 > Linux操作系统 > Oracle over函数的学习笔记二 排序函数的使用

Oracle over函数的学习笔记二 排序函数的使用

原创 Linux操作系统 作者:lucy_lxy 时间:2011-11-02 13:57:13 0 删除 编辑

首先来看排序函数: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/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2010-09-27

  • 博文量
    124
  • 访问量
    391602