OracleのRank()関数(注:この文書は2つのブログを統合したもので、次のリンクがあります)
2766 ワード
1、まず、rankの英語での意味を理解します:等級、つまりこれはデータに等級を確定する関数です.
具体的な構文は次のとおりです.
2、販売を例に、地域、年、月、販売員、売上高の5つのフィールドを記録します.地域、年、月、売上高で販売員をソートすることができ、販売員にとってかなりの等級概念があり、1位は販売が最も高いことです.各地域、年、月、売上高の上位3人の販売員を見つけるには、SQL文はどのように書きますか?
3、新しい问题:売上高50000は深センで、2007年5月に何位にランクインすることができますか?
sqlコードは次のとおりです.
上の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
文はこのように書くことができます.
5、DENSE_RANK()はRANK()に相当しますが、違いがあります.DENCE_RANK()同じレベルを扱う場合、レベルの配列はスキップされません.RANK()は、テーブルTESTのようにスキップされます.
A
B
C
a
liu
wang
a
jin
shu
a
cai
kai
b
yang
du
b
lin
ying
b
yao
cai
b
yang
gg
例:RANKが次の場合:
結果:
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()の場合は、次のようになります.
A
B
C
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
具体的な構文は次のとおりです.
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
B
C
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
B
C
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