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

  • 相关阅读:
    聊聊用机器人做无人驾驶
    透过国外初创公司看高精度地图难题
    百度Apollo无人驾驶入门课程下载
    关于高精度地图定义的探讨
    camera理论基础和工作原理
    FPGA配置OV5640摄像头及RGB图像数据采集
    详细的摄像头模组工作原理!!!
    摄像头PIN脚功能作用
    详解摄像头各个引脚的作用关系
    Linux下UDP的组播接收和发送的简单例子
  • 原文地址:https://www.cnblogs.com/4AMLJW/p/rowNumberOver202003171753.html
Copyright © 2011-2022 走看看