1. 程式人生 > >MySQL8資料庫視窗函式

MySQL8資料庫視窗函式

對於視窗函式,比如row_number(),rank(),dense_rank(),NTILE(),PERCENT_RANK()等等,現在MySQL8版本已經支援了。

row_number()(分組)排序編號 row_number()over(partition by user_no order by create_date desc) as row_num,按照使用者分組,按照create_date排序,對已有資料生成一個編號。   當然也可以不分組,對整體進行排序。任何一個視窗函式,都可以分組統計或者不分組統計(也即可以不要partition by 都可以,看需求)

row_number()over(partition by user_no order by create_date desc) as row_num

rank()   類似於 row_number(),也是排序功能,但是rank()有什麼不一樣?新的事物的出現必然是為了解決潛在的問題。   如果再往測試表中寫入一條資料:insert into order_info values (11,’u0002’,800,’2018-1-22’);   對於測試表中的U002使用者來說,有兩條create_date完全一樣的資料(假設有這樣的資料),那麼在row_number()編號的時候,這兩條資料卻被編了兩個不同的號   理論上講,這兩條的資料的排名是並列最新的。因此rank()就是為了解決這個問題的,也即:排序條件一樣的情況下,其編號也一樣。

dense_rank()

  dense_rank()的出現是為了解決rank()編號存在的問題的,   rank()編號的時候存在跳號的問題,如果有兩個並列第1,那麼下一個名次的編號就是3,結果就是沒有編號為2的資料。   如果不想跳號,可以使用dense_rank()替代。