1. 使用評級函式
評級函式(ranking function)用於計算等級、百分點、n分片等等,下面是幾個常用到的評級函式:
rank():返回資料項在分組中的排名。特點:
在排名相等的情況下會在名次中留下空位dense_rank():與rank不同的是它在排名相等的情況下不會在名次中留下空位cume_dist():返回特定值相對於一組值的位置:
他是「cumulative distribution」(累積分布)的簡寫percent_rank():返回某個值相對於一組值的百分比排名ntile():返回n分片後的值,比如三分片、四分片等等row_number():
為每一條分組紀錄返回乙個數字下面我們分別舉例來說明這些函式的使用
1) rank()與dense-rank()
首先顯示下我們的源表資料的結構及部分資料:
sql> desc all_sales;
名稱是否為空?
型別year not null number(38)
month not null number(38)
prd_type_id not null number(38)
emp_id not null number(38)
amount number(8,2)
sql> select * from all_sales where rownum<11;
year month prd_type_id emp_id amount
2003 1 1 21 10034.84
2003 2 1 21 15144.65
2003 3 1 21 20137.83
2003 4 1 21 25057.45
2003 5 1 21 17214.56
2003 6 1 21 15564.64
2003 7 1 21 12654.84
2003 8 1 21 17434.82
2003 9 1 21 19854.57
2003 10 1 21 21754.19
已選擇10行。
好接下來我們將舉例來說明上述函式的使用:
首先是rank()與dense-rank()的使用:
sql> select
2 prd_type_id,sum(amount),
3 rank() over (order by sum(amount) desc) as rank,
4 dense_rank() over (order by sum(amount) desc) as dense_rank
5 from all_sales
6 where year=2003
7 group by prd_type_id
8 order by rank;
prd_type_id sum(amount) rank dense_rank
5 1 1 1
905081.84 2 2 3
478270.91 3 3 4
402751.16 4 4 2
186381.22 5 5
注意:這裡prd_type_id列為5的sum(amount)的值為空,rank()和dense-rank在這一行的返回值為1。
因為預設狀態下rank()和dense-rank()在遞減排序中將空值指定為最高排名1,而在遞增排序中則把它指定為最低排名。
這裡還有乙個問題就是我們的例子中沒有sum(amount)相等的值,如果有的話rank與dense-rank將表現出區別比如上面的例子如果prd_type_id為4的sum(amount)的值也為:478270.91的話,那麼上面語句的輸出則為:
prd_type_id sum(amount) rank dense_rank
5 1 1 1
905081.84 2 2 3
478270.91 3 3 4
478270.91 3 3 2
186381.22 5 4
此外這裡還有兩個引數來限制空值的排序即:
nulls first和nulls last我們還以上面的例子來看:
sql> select
2 prd_type_id,sum(amount),
3 rank() over (order by sum(amount) desc nulls last) as rank,
4 dense_rank() over (order by sum(amount) desc nulls last) as dense_rank
5 from all_sales
6 where year=2003
7 group by prd_type_id
8* order by rank
prd_type_id sum(amount) rank dense_rank
1 905081.84 1 1
3 478270.91 2 2
4 402751.16 3 3
2 186381.22 4 4
5 5 5
可以看出剛才我們不使用nulls last時prd_type_id為5的空值的排序位於第一,現在則位於第五。
接下來來看分析函式與partition by子句的結合使用:
當需要把分組劃分為子分組時,那麼我們便可以結合pratition by子句和分析函式同時使用。如下例根據月份劃分銷量:
sql> select
2 prd_type_id,month,sum(amount),
3 rank() over (partition by month order by sum(amount) desc) as rank
4 from all_sales
5 where year=2003
6 and amount is not null
7 group by prd_type_id,month
8* order by month,rank
prd_type_id month sum(amount) rank
1 1 38909.04 1
3 1 24909.04 2
4 1 17398.43 3
2 1 14309.04 4
1 2 70567.9 1
4 2 17267.9 2
3 2 15467.9 3
2 2 13367.9 4
1 3 91826.98 1
Oracle分析函式使用總結
1.使用評級函式 評級函式 ranking function 用於計算等級 百分點 n分片等等,下面是幾個常用到的評級函式 rank 返回資料項在分組中的排名。特點 在排名相等的情況下會在名次中留下空位 dense rank 與rank不同的是它在排名相等的情況下不會在名次中留下空位 cume di...
oracle常用函式總結
返回與指定的字元對應的十進位制數 sql select ascii a a,ascii a a,ascii 0 zero,ascii space from dual a a zero space 65 97 48 32 給出整數,返回對應的字元 sql select chr 54740 zhao,c...
oracle函式大全
oracle函式大全 1 第一講單行函式和組函式詳解 pl sql單行函式和組函式詳解 函式是一種有零個或多個引數並且有乙個返回值的程式。在sql中oracle內建了一系列函式,這些函式都可被稱為sql或pl sql語句,函式主要分為兩大類 單行函式 組函式本文將討論如何利用單行函式以及使用規則。s...