OracleのRank()関数(注:この文書は2つのブログを統合したもので、次のリンクがあります)

2766 ワード

1、まず、rankの英語での意味を理解します:等級、つまりこれはデータに等級を確定する関数です.
具体的な構文は次のとおりです.
RANK() OVER ([query_partition_clause] order_by_clause)

2、販売を例に、地域、年、月、販売員、売上高の5つのフィールドを記録します.地域、年、月、売上高で販売員をソートすることができ、販売員にとってかなりの等級概念があり、1位は販売が最も高いことです.各地域、年、月、売上高の上位3人の販売員を見つけるには、SQL文はどのように書きますか?
SELECT AREA_CODE, YEAR, MONTH, SALEROOM, SALER, RANK() OVER(PARTITION BY AREA_CODE, YEAR, MONTH ORDER BY AREA_CODE, YEAR, MONTH, SALEROOM) SALE_RANK FROM SALE_TABLE;

3、新しい问题:売上高50000は深センで、2007年5月に何位にランクインすることができますか?
sqlコードは次のとおりです.
SELECT RANK('BEIJING', 2007, 5, 50000) WITHIN GROUP (ORDER BY AREA_CODE, YEAR, MONTH, SALEROOM) SALE_RANK FROM SALE_TABLE;

上のSQLでできますが、Rank()のパラメータは定数、定数式でなければなりません.パラメータの個数、タイプもorder by後のフィールドのタイプに対応しています.
4、以下にいくつかの例を用いて訓練を行う
        1)TABLE : S (SUBJECT , MARK)
 SUBJECT
 MARK
数学
 80
国語
 70
数学
 90
数学
 60
数学
 100
国語
 88
国語
 65
国語
 77
今私が望んでいる結果は、各科目の上位3位の点数です.
 SUBJECT
 MARK
数学
 100
数学
 90
数学
 80
国語
 88
国語
 77
国語
 70
文はこのように書くことができます.
SELECT * 
FROM 
(SELECT A.SUBJECT, A.MARK, RANK() OVER(PARTITION BY SUBJECT ORDER BY SUBJECT, MARK DESC) MARK_RANK FROM S ) B WHERE B.MARK <= 3;

    5、DENSE_RANK()はRANK()に相当しますが、違いがあります.DENCE_RANK()同じレベルを扱う場合、レベルの配列はスキップされません.RANK()は、テーブルTESTのようにスキップされます.
 A


 a
 liu
 wang
 a
 jin
 shu
 a
 cai
 kai
 b
 yang
 du
 b
 lin
 ying
 b
 yao
 cai
 b
 yang
 gg
例:RANKが次の場合:
SELECT M.A, M.B, M.C, RANK() OVER(PARTITION BY A ORDER BY B) LIU FROM TEST 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
 gg
 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 TEST M;

 A


LIU
 a
 cai
 kai
1
 a
 jin
 shu
2
 a
 liu
 wang
3
 b
 bin
 ying
1
 b
 yang
 du
2
 b
 yang
 gg
2
 b
 yao
 cai
3
 
参照リンク:http://keke-wanwei.iteye.com/blog/138632   http://downpour.iteye.com/blog/24445