例:
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...)是將查詢的結果先分組排序再加入僞列。