oracle中聚合函式RANK和dense_rank的使用(轉)

heying1229發表於2007-06-22

聚合函式RANK 和 dense_rank 主要的功能是計算一組數值中的排序值。

在9i版本之前,只有分析功能(analytic ),即從一個查詢結果中計算每一行的排序值,是基於order_by_clause子句中的value_exprs指定欄位的。
其語法為:
RANK ( ) OVER ( [query_partition_clause] order_by_clause )

在9i版本新增加了合計功能(aggregate),即對給定的引數值在設定的排序查詢中計算出其排序值。這些引數必須是常數或常值表示式,且必須和ORDER BY子句中的欄位個數、位置、型別完全一致。
其語法為:
RANK ( expr [, expr]... ) WITHIN GROUP
( ORDER BY
expr [ DESC | ASC ] [NULLS { FIRST | LAST }]
[, expr [ DESC | ASC ] [NULLS { FIRST | LAST }]]...
)

例子1:
有表Table內容如下
COL1 COL2
1 1
2 1
3 2
3 1
4 1
4 2
5 2
5 2
6 2

分析功能:列出Col2分組後根據Col1排序,並生成數字列。比較實用於在成績表中查出各科前幾名的資訊。
SELECT a.*,RANK() OVER(PARTITION BY col2 ORDER BY col1) "Rank" FROM table a;
結果如下:
COL1 COL2 Rank
1 1 1
2 1 2
3 1 3
4 1 4
3 2 1
4 2 2
5 2 3
5 2 3
6 2 5

例子2:
TABLE:A (科目,分數)

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


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


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

select * from (select rank() over(partition by 科目 order by 分數 desc) rk,a.* from a) t
where t.rk<=3;

例子3:

合計功能:計算出數值(4,1)在Orade By Col1,Col2排序下的排序值,也就是col1=4,col2=1在排序以後的位置
SELECT RANK(4,3) WITHIN GROUP (ORDER BY col1,col2) "Rank" FROM table;
結果如下:
Rank
4

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/10172717/viewspace-920438/,如需轉載,請註明出處,否則將追究法律責任。

相關文章