zoukankan      html  css  js  c++  java
  • 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 降序)排序查询结果。

  • 相关阅读:
    php 给图片添加文字水印 可控制位置,旋转,多行文字
    太多的用户请求,网站出现了504
    这些问题,你注意了吗?
    ubuntu 系统环境配置记录
    node.js开发指南中出现的问题 has no method 'router'解决办法
    在nodejs express 中使用session的功能
    更改窗口大小,重新加载微博发布框
    原生js控制audio标签自动播放
    利用css3转换transform画五星红旗
    css3+js旗帜飘动
  • 原文地址:https://www.cnblogs.com/4AMLJW/p/rowNumberOver202003171753.html
Copyright © 2011-2022 走看看