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 ;
