1. rank函數(shù)的介紹
介紹完rollup和cube函數(shù)的使用,下面我們來看看rank系列函數(shù)的使用方法.
問題2.我想查出這幾個(gè)月份中各個(gè)地區(qū)的總話費(fèi)的排名.
Quote:
為了將rank,dense_rank,row_number函數(shù)的差別顯示出來,我們對(duì)已有的基礎(chǔ)數(shù)據(jù)做一些修改,將5763的數(shù)據(jù)改成與5761的數(shù)據(jù)相同.
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函數(shù)來計(jì)算各個(gè)地區(qū)的話費(fèi)排名.
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
我們可以看到紅色標(biāo)注的地方出現(xiàn)了,跳位,排名3沒有出現(xiàn)下面我們?cè)倏纯磀ense_rank查詢的結(jié)果.
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 這是這里出現(xiàn)了第三名
5762 52039.62 4
Elapsed: 00:00:00.00
在這個(gè)例子中,出現(xiàn)了一個(gè)第三名,這就是rank和dense_rank的差別,rank假如出現(xiàn)兩個(gè)相同的數(shù)據(jù),那么后面的數(shù)據(jù)就會(huì)直接跳過這個(gè)排名,而dense_rank則不會(huì),差別更大的是,row_number哪怕是兩個(gè)數(shù)據(jù)完全相同,排名也會(huì)不一樣,這個(gè)特性在我們想找出對(duì)應(yīng)沒個(gè)條件的唯一記錄的時(shí)候又很大用處
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函數(shù)中,我們發(fā)現(xiàn),哪怕sum(local_fare)完全相同,我們還是得到了不一樣排名,我們可以利用這個(gè)特性剔除數(shù)據(jù)庫中的重復(fù)記錄.
這個(gè)帖子中的幾個(gè)例子是為了說明這三個(gè)函數(shù)的基本用法的. 下個(gè)帖子我們將具體介紹他們的一些用法.
2. 三個(gè)函數(shù)的基本用法
a. 取出數(shù)據(jù)庫中最后入網(wǎng)的n個(gè)用戶
select user_id,tele_num,user_name,user_status,create_date
from (
select user_id,tele_num,user_name,user_status,create_date,
rank() over (order by create_date desc) add_rank
from user_info
)
where add_rank <
= :n;
b.根據(jù)object_name刪除數(shù)據(jù)庫中的重復(fù)記錄
create table t as select obj#,name from sys.obj$;
再insert into t1 select * from t1 數(shù)次.
delete from t1 where rowid in (
select row_id from (
select rowid row_id,row_number() over (partition by obj# order by rowid ) rn
) where rn <> 1
);
c. 取出各地區(qū)的話費(fèi)收入在各個(gè)月份排名.
SQL> select bill_month,area_code,sum(local_fare) local_fare,
2 rank() over (partition by bill_month order by sum(local_fare) desc) area_rank
3 from t
4 group by bill_month,area_code
5 /
BILL_MONTH AREA_CODE LOCAL_FARE AREA_RANK
--------------- --------------- -------------- ----------
200405 5765 25057.74 1
200405 5761 13060.43 2
200405 5763 13060.43 2
200405 5762 12643.79 4
200405 5764 12487.79 5
200406 5765 26058.46 1
200406 5761 13318.93 2
200406 5763 13318.93 2
200406 5764 13295.19 4
200406 5762 12795.06 5
200407 5765 26301.88 1
200407 5761 13710.27 2
200407 5763 13710.27 2
200407 5764 13444.09 4
200407 5762 13224.30 5
200408 5765 27130.64 1
200408 5761 14135.78 2
200408 5763 14135.78 2
200408 5764 13929.69 4
200408 5762 13376.47 5
20 rows selected.
SQL>
3. lag和lead函數(shù)介紹
取出每個(gè)月的上個(gè)月和下個(gè)月的話費(fèi)總額
1 select area_code,bill_month, local_fare cur_local_fare,
2 lag(local_fare,2,0) over (partition by area_code order by bill_month ) PRe_local_fare,
3 lag(local_fare,1,0) over (partition by area_code order by bill_month ) last_local_fare,
4 lead(local_fare,1,0) over (partition by area_code order by bill_month ) next_local_fare,
5 lead(local_fare,2,0) over (partition by area_code order by bill_month ) post_local_fare
6 from (
7 select area_code,bill_month,sum(local_fare) local_fare
8 from t
9 group by area_code,bill_month
10* )
SQL> /
AREA_CODE BILL_MONTH CUR_LOCAL_FARE PRE_LOCAL_FARE LAST_LOCAL_FARE NEXT_LOCAL_FARE POST_LOCAL_FARE
--------- ---------- -------------- -------------- --------------- --------------- ---------------
5761 200405 13060.433 0 0 13318.93 13710.265
5761 200406 13318.93 0 13060.433 13710.265 14135.781
5761 200407 13710.265 13060.433 13318.93 14135.781 0
5761 200408 14135.781 13318.93 13710.265 0 0
5762 200405 12643.791 0 0 12795.06 13224.297
5762 200406 12795.06 0 12643.791 13224.297 13376.468
5762 200407 13224.297 12643.791 12795.06 13376.468 0
5762 200408 13376.468 12795.06 13224.297 0 0
5763 200405 13060.433 0 0 13318.93 13710.265
5763 200406 13318.93 0 13060.433 13710.265 14135.781
5763 200407 13710.265 13060.433 13318.93 14135.781 0
5763 200408 14135.781 13318.93 13710.265 0 right">(出處:清風(fēng)軟件下載學(xué)院)