row_number() over (partition by..order by...)分組排序

例:

select 1 a,2 b,3 c from dual 
union all 
select 2 a,6 b,7 c from dual 
union all 
select 1 a,3 b,4 c from dual 
union all 
select 2 a,5 b,6 c from dual 
union all 
select 1 a,4 b,5 c from dual

結果:

1、使用row_number() over (partition by..order by...)可以對這些數據進行分組排序顯示。如下


select d.*,row_number() over(partition by a order by a) rownumber from --根據a分組,並且根據a排序

select 1 a,2 b,3 c from dual 
union all 
select 2 a,6 b,7 c from dual 

union all 
select 1 a,3 b,4 c from dual 
union all 
select 2 a,5 b,6 c from dual 
union all 
select 1 a,4 b,5 c from dual
)d


結果

2、所以可以根據這個函數可以滿足每一個分組取一種數據。

select * from (select d.*,row_number() over(partition by a order by a) rownumber from 
(select 1 a,2 b,3 c from dual 
 union all select 2 a,6 b,7 c from dual 
 union all select 1 a,3 b,4 c from dual 
 union all select 2 a,5 b,6 c from dual 
 union all select 1 a,4 b,5 c from dual)d
 )where rownumber=1 --取得每一組的第一個

結果

3、使用rownum的情況

select d.*,rownum rownumber from   --使用rownum
(select 1 a,2 b,3 c from dual 
 union all select 2 a,6 b,7 c from dual 
 union all select 1 a,3 b,4 c from dual 
 union all select 2 a,5 b,6 c from dual 
 union all select 1 a,4 b,5 c from dual)d

結果


兩者區別:rownum是將查詢的結果直接加入僞列,而row_number() over (partition by..order by...)是將查詢的結果先分組排序再加入僞列。



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