2. rank函數的介紹介紹完rollup和cube函數的使用,下面我們來看看rank系列函數的使用方法.
問題2.我想查出這幾個月份中各個地區的總話費的排名.
Quote: |
為了將rank,dense_rank,row_number函數的差別顯示出來,我們對已有的基礎數據做一些修改,將5763的數據改成與5761的數據相同. 1 update t t1 set local_fare = ( 2 select local_fare from t t2 3 where t1.bill_month = t2.bill_month 4 and t1.net_type = t2.net_type 5 and t2.area_code = '5761' 6* ) where area_code = '5763' 07:19:18 SQL> /
8 rows updated.
Elapsed: 00:00:00.01
我們先使用rank函數來計算各個地區的話費排名. 07:34:19 SQL> select area_code,sum(local_fare) local_fare, 07:35:25 2 rank() over (order by sum(local_fare) desc) fare_rank 07:35:44 3 from t 07:35:45 4 group by area_codee 07:35:50 5 07:35:52 SQL> select area_code,sum(local_fare) local_fare, 07:36:02 2 rank() over (order by sum(local_fare) desc) fare_rank 07:36:20 3 from t 07:36:21 4 group by area_code 07:36:25 5 /
AREA_CODE LOCAL_FARE FARE_RANK ---------- -------------- ---------- 5765 104548.72 1 5761 54225.41 2 5763 54225.41 2 5764 53156.77 4 5762 52039.62 5
Elapsed: 00:00:00.01我們可以看到紅色標注的地方出現了,跳位,排名3沒有出現 下面我們再看看dense_rank查詢的結果.
07:36:26 SQL> select area_code,sum(local_fare) local_fare, 07:39:16 2 dense_rank() over (order by sum(local_fare) desc ) fare_rank 07:39:39 3 from t 07:39:42 4 group by area_code 07:39:46 5 /
AREA_CODE LOCAL_FARE FARE_RANK ---------- -------------- ---------- 5765 104548.72 1 5761 54225.41 2 5763 54225.41 2 5764 53156.77 3 這是這里出現了第三名 5762 52039.62 4
Elapsed: 00:00:00.00 在這個例子中,出現了一個第三名,這就是rank和dense_rank的差別, rank如果出現兩個相同的數據,那么后面的數據就會直接跳過這個排名,而dense_rank則不會, 差別更大的是,row_number哪怕是兩個數據完全相同,排名也會不一樣,這個特性在我們想找出對應沒個條件的唯一記錄的時候又很大用處
1 select area_code,sum(local_fare) local_fare, 2 row_number() over (order by sum(local_fare) desc ) fare_rank 3 from t 4* group by area_code 07:44:50 SQL> /
AREA_CODE LOCAL_FARE FARE_RANK ---------- -------------- ---------- 5765 104548.72 1 5761 54225.41 2 5763 54225.41 3 5764 53156.77 4 5762 52039.62 5在row_nubmer函數中,我們發現,哪怕sum(local_fare)完全相同,我們還是得到了不一樣排名,我們可以利用這個特性剔除數據庫中的重復記錄.
這個帖子中的幾個例子是為了說明這三個函數的基本用法的. 下個帖子我們將詳細介紹他們的一些用法. |
|
|