排序函數row_number,rank,dense_rank區別

row_number,rank,dense_rank這三個都是排序函數,幾乎每種數據庫都支持這幾個函數。
它們都是配合開窗函數over(partition by col1 order by col2)使用。下面根據實例看看這三個有什麼區別:

首先建個臨時表,然後插入一些數據:

create table tmp_user(
a varchar2(6),
b int);


insert into tmp_user(a,b) 
select 'A',10 from dual union all
select 'A',20 from dual union all
select 'A',20 from dual union all
select 'A',30 from dual union all
select 'A',40 from dual union all
select 'A',50 from dual union all
select 'B',10 from dual union all
select 'B',20 from dual union all
select 'B',20 from dual union all
select 'B',30 from dual union all
select 'B',30 from dual union all
select 'B',60 from dual;

然後執行查詢語句:

select a,
       b,
       rank() over(partition by a order by b desc) rank,
       dense_rank() over(partition by a order by b desc) dense_rank,
       row_number() over(partition by a order by b desc) row_number
  from tmp_user;

結果爲:

RN	A	B	RANK DENSE_RANK ROW_NUMBER
1	A	50	1	1	1
2	A	40	2	2	2
3	A	30	3	3	3
4	A	20	4	4	4    <------
5	A	20	4	4	5    <------
6	A	10	6	5	6
7	B	60	1	1	1
8	B	30	2	2	2
9	B	30	2	2	3    <------
10	B	20	4	3	4    <------
11	B	20	4	3	5    <------
12	B	10	6	4	6

從結果可以看出三者的區別:
row_number():不管值是否相同,都是連續排列,不跳躍---->可用作分頁
rank():如果值相同,排序一樣,後面的排序跳躍---->可用作學生分數排名
dense_rank():如果值相同,排序一樣,後面的排序不跳躍

通常前面兩個使用的比較多。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章