Oracle RANK函數

 

其實現在Oracle對於rank和dense_rank已經支持合計功能,不過這次我僅僅使用了其分析功能。具體語法如下:RANK ( ) OVER ( [query_partition_clause] order_by_clause )。 

下面給出一些來自網上的示例: 

TABLE:S (subject,mark) 

數學,80 
語文,70 
數學,90 
數學,60 
數學,100 
語文,88 
語文,65 
語文,77 

現在我想要的結果是:每門科目的前3名的分數 

數學,100 
數學,90 
數學,80 
語文,88 
語文,77 
語文,70 
那麼語句就這麼寫: 

select * from (select rank() over(partition by subject order by mark desc) rk,S.* from S) T 

where T.rk<=3; 

效果和ROW_NUMBER()一樣



dense_rank與rank()用法相當,但是有一個區別:dence_rank在處理相同的等級時,等級的數值不會跳過。rank則跳過。 

例如:表 

    A B C 
a          liu          wang 
a          jin          shu 
a          cai          kai 
b          yang      du 
b          lin          ying 
b          yao        cai 
b          yang      99 

例如:當rank時爲: 

select m.a,m.b,m.c,rank() over(partition by a order by b) liu from test3 m 

A          B             C          LIU 
a          cai          kai          1 
a          jin           shu        2 
a          liu           wang     3 
b          lin           ying        1 
b          yang      du           2 
b          yang      99           2 
b          yao        cai           4 

而如果用dense_rank時爲: 

select m.a,m.b,m.c,dense_rank() over(partition by a order by b) liu from test3 m 

A          B             C          LIU 
a          cai          kai          1 
a          jin           shu        2 
a          liu           wang     3 
b          lin           ying        1 
b          yang      du           2 
b          yang      99           2 

b          yao        cai           3 


發佈了260 篇原創文章 · 獲贊 10 · 訪問量 45萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章