Oracle分析函式使用總結

2021-12-25 12:32:33 字數 3230 閱讀 8249

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;

名稱是否為空? 型別

yearnot null number(38)

monthnot null number(38)

prd_type_idnot null number(38)

emp_idnot null number(38)

amountnumber(8,2)

sql> select * from all_sales where rownum<11;

year month prd_type_id emp_id amount

200311 21 10034.84

200321 21 15144.65

200331 21 20137.83

200341 21 25057.45

200351 21 17214.56

200361 21 15564.64

200371 21 12654.84

200381 21 17434.82

200391 21 19854.57

2003 101 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

5111 905081.8422

3 478270.9133

4 402751.1644

2 186381.2255

注意:這裡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

5111 905081.8422

3 478270.9133

4 478270.9133

2 186381.2254

此外這裡還有兩個引數來限制空值的排序即: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.8411

3 478270.9122

4 402751.1633

2 186381.2244

555可以看出剛才我們不使用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

11 38909.041

31 24909.042

41 17398.433

21 14309.044

12 70567.91

42 17267.92

Oracle分析函式使用總結

1.使用評級函式 評級函式 ranking function 用於計算等級 百分點 n分片等等,下面是幾個常用到的評級函式 rank 返回資料項在分組中的排名。特點 在排名相等的情況下會在名次中留下空位dense rank 與rank不同的是它在排名相等的情況下不會在名次中留下空位cume dist...

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...