有關oracle中聚合函式rank和dense_rank的使用

maojinyu發表於2011-03-30
其實現在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;

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

[@more@]

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/9907339/viewspace-1047948/,如需轉載,請註明出處,否則將追究法律責任。

相關文章