rownum, row_number(), rank() , dense_rank(), partition by ,max() keep 語句的區別與用法


rownum,rownumber(), rank(),dense_rank()都是用來為記錄分配序號的,

rownum只能在orderby語句排完序后,在外層嵌套查詢才能獲得正確的行號,用起來相當復雜

select rownum, designator from airport_heliport_ts; --這樣寫是無效的

正因為這樣,產生了row_number() over(order by ) 用法:

select row_number() over(order by designator),  designator from airport_heliport_ts ;

它的好處是用一級sql查詢就能實現上面的 加行號功能。

rank(),dense_rank()的功能與之非常相似,區別是:

row_number()對重復的排序值分配不同的行號;

rank()對重復排序值分配相同的序號,且行號不連續;如前三個值重復,序號就是1,1,1,4

dense_rank()對重復排序值分配相同的序號,但行號連續;如前三個值重復,序號就是1,1,1,2

如果只需返回上述排序后的最大值或最小值,可用:(其中的first可換成last實現升、降序)

select max(designator) keep(dense_rank first order by designator)   from airport_heliport_ts t;

分組排序partition

前面的幾種排序方法都只能整體排序,如果要按條件分組后再排序,就要用partition函數,如:

select row_number() over(partition by bureau_id order by bureau_id,designator), bureau_id,  designator from airport_heliport_ts t ;

實現按bureau_id分區后,在每個相同的bureau_id分區內排列序號,類似於group by函數,但查詢結果不會分組

除了row_number()外,parttion還支持wm_concat等集合函數,能比wm_concat(distinct) +group by實現更靈活的排序方式

select wm_concat(designator) over(partition by t.bureau_id order by bureau_id,designator ), bureau_id,  designator from airport_heliport_ts t ;

 

select rownum, designator from airport_heliport_ts;
select row_number() over(order by designator),  designator from airport_heliport_ts ;
select rank()over(order by designator),  designator from airport_heliport_ts ;
select dense_rank()over(order by designator),  designator from airport_heliport_ts ;
select max(designator) keep(dense_rank first order by designator)   from airport_heliport_ts t;
select row_number() over(partition by t.bureau_id order by bureau_id,designator), bureau_id,  designator from airport_heliport_ts t ;
select wm_concat(designator) over(partition by t.bureau_id order by bureau_id,designator ), bureau_id,  designator from airport_heliport_ts t ;


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM