1. 程式人生 > >row_number() over(...)函數

row_number() over(...)函數

() order col create ack ted 之前 紅包 blog

row_number() over(...)簡直就是個吊炸天的函數。

之前用group by分組時select的字段除了group by字段外,其他字段都要用聚合函數包起來(如果有的話),如count(1),sum(amount),max(created_date),這樣對其他非分組字段的處理只能滿足一些常規的需求,如分組查詢created_date最大的那條記錄

以平安壽險紅包項目舉例

需求一:查詢投保表中每個子紅包最近一次的投保失敗記錄

需求二:查詢投保表中每個子紅包最近兩次的投保失敗記錄

用group by 絞盡腦汁也想不出來怎麽寫,但是用row_number() over(...) 相當簡單

需要說明的是row_number()是個函數,over()也是個函數,兩者要在一起使用,單獨使用哪一個都會報錯的。

row_number() over(...)在over的括號中可以有3種寫法:

1.只寫partition by 某字段,按照某字段分組,每一條記錄都會增加一個row_number虛擬字段,每一組row_number都是從1開始往上累計,1,2,3。。。,排序是按照記錄的插入順序排序的,沒有按照某字段嚴格排序

2.只寫order by 某字段,按照某字段排序,這個時候只排序不分組了,同樣每一條記錄都會增加一個row_number虛擬字段,按照插入順序從1往上累加,也是沒有按照某字段嚴格排序

3.partition by 某字段 order by 某字段,按照某字段分組並且按照某字段排列(默認是升序排列,最後面跟上desc則是降序排列),這樣每一條記錄都會增加一個row_number虛擬字段,每一組row_number都是從1開始往上累計,且排序是按照某字段嚴格排序的。

這樣滿足需求二的sql就可以這樣寫:

with r as (
    select rpc.*, row_number() over(partition by child_redpacket_id order by updated_date desc)
    from red_packet_customerinfo rpc
    
where insure_status = -1 ) select r.child_redpacket_id, r.error_msg, r.updated_date from r where r.row_number <= 2 order by r.updated_date desc, child_redpacket_id

row_number() over(...)函數