mysql rownumber over_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

运行结果如下图所示:

mysql rownumber over_mysql实现row_number()和row_number() over(partition by)_第1张图片

解释:对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 降序)排序查询结果。

你可能感兴趣的:(mysql,rownumber,over)