之前整理了rank() over()的用法,但是,今天遇到了問題,居然還是不會,這裡再重新學習一下。
1. rank()函數
rank是等級的意思,rank()函數是一個聚合函數,也是一個分析函數。
之前隻知道,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, '喬巴');
資料顯示:
2. 作為聚合函數的用法
實作功能:根據order by 後面的字段排序後,在rank()中指定的資料的記錄順序号(就是排在第幾名)
示例:
根據id排序後,id是4的記錄的位置
select rank(4) within group(order by id) "location" from t_ygy_demo_score;
注意:這裡的rank()的參數和order by 後的參數數量需要一緻。
3. 作為分析函數的用法
功能:
分析每個記錄的排序或等級,rank()值相同時排名相同,其後排名跳躍不連續
示例:
1)查詢出每門課程的學生排名,并且顯示出名次
不顯示名次的話,我們在where後,使用order by 就可以實作,但是顯示名次的話,就不行了,
select id,course,name,score ,rank() over(partition by course order by score desc)"名次" from t_ygy_demo_score;
他這裡的排名,分數相同的排名是相同的名次是相同的。
2)按照name排序,并顯示排名(雖然沒什麼意義)
select id,name,course,score ,rank() over(order by name) "名次" from t_ygy_demo_score;
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;
4. 總結
1、partition by用于給結果集分組,如果沒有指定那麼它把整個結果集作為一個分組。
2、Rank 是在每個分組内部進行排名的。
5. 附錄
可以參考的文章:
http://www.cnblogs.com/mycoding/archive/2010/05/29/1747065.html