mysql實現row_number()和row_number() over(partition by)


  • row_number()

  select @row_num:=@row_num+1 as rn,a.* from (select @row_num:=0) r, test_table t

  解釋:給test_table里的數據設置行號, rn是行號

  • row_number() over(partition by)  

  select if(@mdev_copy = a.MDEVICEID_COPY OR (@mdev_copy IS NULL AND a.MDEVICEID_COPY IS NULL) , @num := @num+1 , @num := 1) as rn , @mdev_copy := a.MDEVICEID_COPY
  from (select * from OMS_AIM_BDDW GROUP BY MDEVICEID_COPY ORDER BY mdate_copy DESC) a,(SELECT @num := 0, @mdev_copy := null) b

  運行結果如下圖所示:

  

  解釋:對OMS_AIM_BDDW 表按照MDEVICEID_COPY 字段做分組設置行號rn , num是分組的數據行號,order by對字段進行排序;

   我們總體來理清一下代碼的思路吧,其實思路很簡單:如上面的sql,分為表a和表b,表a是我們需要返回的數據集,表b作用是初始化變量num與mdev_copy(網上都是這樣的寫法,但是我測試的時候,不添加表b,返回的結果也一樣,此處存在疑惑,可能涉及到SQL的優化,所以建議最好還是添加上表b!),先將其分組和排序,得到最終結果的前半部分,接着和表b拼接起來。

  代碼細分析:首先這段代碼if(@mdev_copy = a.MDEVICEID_COPY OR (@mdev_copy IS NULL AND a.MDEVICEID_COPY IS NULL) , @num := @num+1 , @num := 1) as rn 是指:每行判斷當前行的MDEVICEID_COPY 是否和前一行@mdev_copy 變量的值相等,如果相等,@num:=@num+1,否則@num:=1。這里有個地方要注意的是每一行都需要執行后重新賦值@mdev_copy = a.MDEVICEID_COPY ,這個賦值必須要在判斷之后,否則會造成一直遞增。原因我猜測在sql中也是按順序執行的,先執行的判斷,執行判斷時@type還沒有更新,取的是上一次的值。

  (select * from OMS_AIM_BDDW GROUP BY MDEVICEID_COPY ORDER BY mdate_copy DESC) a 該段代碼是指(以MDEVICEID_COPY) 分組並(根據mdate_copy 降序)排序查詢結果。


免責聲明!

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



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