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

  • 相关阅读:
    python3中模块初识
    Django 应用程序 + 模型 + 基本数据访问
    Axure文本框验证和外部url的调用
    MATLAB 实时脚本(live-script)使用
    Django MTV 开发模式 + 数据库配置
    Django 模板继承
    Django 修改视图文件(views.py)并加载Django模块 + 利用render_to_response()简化加载模块 +locals()
    Django Context对象 + 过滤器 + 标签
    Axure 页面内多组内容切换的实现 + 利用一个内联框架实现百度地图访问
    MATLAB绘图功能(2) 二维底层绘图修饰
  • 原文地址:https://www.cnblogs.com/4AMLJW/p/rowNumberOver202003171753.html
Copyright © 2011-2022 走看看