您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

mysql实现row_number()和row_number() over(partition by)

bubuko 2022/1/25 20:04:55 mysql 字数 1660 阅读 770 来源 http://www.bubuko.com/infolist-5-1.html

在MySQL中怎么实现row_number() over(partition by)函数 ...
  • row_number()

  select @rownum:=@rownum+1 as rn,t.* from (select @rownum:=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 降序)排序查询结果。

mysql实现row_number()和row_number() over(partition by)

原文:https://www.cnblogs.com/4AMLJW/p/rowNumberOver202003171753.html


如果您也喜欢它,动动您的小指点个赞吧

除非注明,文章均由 laddyq.com 整理发布,欢迎转载。

转载请注明:
链接:http://laddyq.com
来源:laddyq.com
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


联系我
置顶