- 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 降序)排序查詢結果。