天天看點

Oracle 中rank() over()的用法

之前整理了rank() over()的用法,但是,今天遇到了問題,居然還是不會,這裡再重新學習一下。

1. rank()函數

        rank是等級的意思,rank()函數是一個聚合函數,也是一個分析函數。

之前隻知道,rank()函數可以和over()一起使用,用來排序什麼的,原來還有這些知識

Oracle 中rank() over()的用法

,孤陋寡聞了。

準備工作:

建立一個表

-- Create table
create table T_YGY_DEMO_SCORE
(
  ID     NUMBER(11),
  COURSE VARCHAR2(10),
  SCORE  NUMBER(5,2),
  NAME   VARCHAR2(20)
)

           
-- Add comments to the table 
comment on table T_YGY_DEMO_SCORE
  is '學生成績表';
-- Add comments to the columns 
comment on column T_YGY_DEMO_SCORE.ID
  is 'ID';
comment on column T_YGY_DEMO_SCORE.COURSE
  is '課程名';
comment on column T_YGY_DEMO_SCORE.SCORE
  is '分數';
comment on column T_YGY_DEMO_SCORE.NAME
  is '學生姓名';
           

資料:

insert into T_YGY_DEMO_SCORE (ID, COURSE, SCORE, NAME)
values (1, '數學', 100, '路飛');
insert into T_YGY_DEMO_SCORE (ID, COURSE, SCORE, NAME)
values (2, '數學', 90, '索隆');
insert into T_YGY_DEMO_SCORE (ID, COURSE, SCORE, NAME)
values (3, '數學', 80, '喬巴');
insert into T_YGY_DEMO_SCORE (ID, COURSE, SCORE, NAME)
values (4, '國文', 90, '路飛');
insert into T_YGY_DEMO_SCORE (ID, COURSE, SCORE, NAME)
values (5, '國文', 90, '索隆');
insert into T_YGY_DEMO_SCORE (ID, COURSE, SCORE, NAME)
values (6, '國文', 80, '喬巴');
insert into T_YGY_DEMO_SCORE (ID, COURSE, SCORE, NAME)
values (7, '英語', 90, '路飛');
insert into T_YGY_DEMO_SCORE (ID, COURSE, SCORE, NAME)
values (8, '英語', 80, '索隆');
insert into T_YGY_DEMO_SCORE (ID, COURSE, SCORE, NAME)
values (9, '英語', 80, '喬巴');
           

資料顯示:

Oracle 中rank() over()的用法

2. 作為聚合函數的用法

Oracle 中rank() over()的用法

實作功能:根據order by 後面的字段排序後,在rank()中指定的資料的記錄順序号(就是排在第幾名)

示例:

根據id排序後,id是4的記錄的位置

select rank(4) within group(order by id) "location" from t_ygy_demo_score;
           
Oracle 中rank() over()的用法

注意:這裡的rank()的參數和order by 後的參數數量需要一緻。

3. 作為分析函數的用法

Oracle 中rank() over()的用法

功能:

分析每個記錄的排序或等級,rank()值相同時排名相同,其後排名跳躍不連續 

示例:

1)查詢出每門課程的學生排名,并且顯示出名次

不顯示名次的話,我們在where後,使用order by 就可以實作,但是顯示名次的話,就不行了,

select id,course,name,score ,rank() over(partition by course order by score desc)"名次" from t_ygy_demo_score;
           
Oracle 中rank() over()的用法

他這裡的排名,分數相同的排名是相同的名次是相同的。

2)按照name排序,并顯示排名(雖然沒什麼意義)

select id,name,course,score ,rank() over(order by name) "名次" from t_ygy_demo_score;
           
Oracle 中rank() over()的用法

3) 查詢出每門課程的最高分的資訊

select * from (select id ,name,course,score,rank() over(partition by course order by score desc) rank from t_ygy_demo_score) rs where rs.rank=1;
           
Oracle 中rank() over()的用法

4. 總結

1、partition  by用于給結果集分組,如果沒有指定那麼它把整個結果集作為一個分組。

2、Rank 是在每個分組内部進行排名的。

5. 附錄

可以參考的文章:

                           http://www.cnblogs.com/mycoding/archive/2010/05/29/1747065.html