oracle有关函数 rank(),row_number(),dense_rank(),over()使用小结

我们直接来动手实验吧,原理性的描述可以网上百度。

step 建表

create table ttt(name varchar2(10),class number,grade number);

构造如下数据,插入到表中

    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

rank()

--rank 跳跃性排序 eg:有两个第一,接下来就是第三 ,grade 按同一clas,降序显示
    select name,class,grade,rank()over(partition by class order by grade desc) sort_num from ttt;

 row_number()

    select name,class,grade,row_number() over(partition by class order by grade desc) mm from ttt;

 dense_rank()

select name,class,grade,dense_rank() over(partition by class order by grade desc) mm from ttt;

 需求:求每个班中,成绩为第一名的学生。(可能存在多个人并列第一)

 dense_rank()与RANK()都可以 ,row_number() 只能取得一位。

扩展:

     --按分组的列累计,分组后给出总和
          select name,class,grade,sum(grade) over(partition by class order by grade desc) mm ,
          sum(grade) over(partition by class ) mm02
          from ttt;
原文地址:https://www.cnblogs.com/gudaozi/p/8575839.html