美文网首页数据库
分组排序row_number() over()函数

分组排序row_number() over()函数

作者: 小强不可爱 | 来源:发表于2018-03-26 21:54 被阅读0次

    函数作用:用于分组排序。
    这里有一张车辆出车信息表:CARTIMEINFO_OBD,
    任务:查询出每辆车最新出车时间。

    效果:(后面的RN自选) 效果图.png 。
    分析:思路很简单,我们只需要对每辆车车牌号进行分组,分组后取最新OUT_TIME就可以了。
    问题:一开始我在mysql数据库中直接通过group by plate_number order by out_time有数据并且是分组了,但是出车的时间确实最早的,这并不是我们想要的效果。我在orcale数据库中同样适用上述语句查询,结果查询语句不正确.....

    首先需要理解row_number() over()这个函数的用法,看下面sql:

    SELECT 
        PLATE_NUMBER,
        OUT_TIME,
        ROW_NUMBER() OVER( PARTITION BY PLATE_NUMBE ORDER BY OUT_TIME DESC) rn 
     FROM CARTIMEINFO_OBD
    

    over()中关键词PARTITION BY:以PLATE_NUMBER(车牌号)分组,
    ORDER BY:这个跟容易理解,就是排序,当然这里是分组后进行排序,
    这里的RN就是每组的排序了(-_- )。
    该sql查询后如图:

    分组排序后.png

    以上初步解决了怎么分组和排序的问题,接下来只需要通过RN取出我们需要的数据了,这里我只需要取出最新出车时间,在函数中我们通过ORDER BY OUT_TIME DESC进行了降序,所以只需要在后面增加条件WHERE RN=1就是我们需要的了。如下sql:

    SELECT 
      a.PLATE_NUMBER PLATE_NUMBER,
      a.OUT_TIME OUT_TIME   
    FROM ( 
       SELECT 
       PLATE_NUMBER,
       OUT_TIME,  
       ROW_NUMBER() OVER( PARTITION BY PLATE_NUMBER ORDER BY OUT_TIME DESC) rn 
       FROM CARTIMEINFO_OBD) a WHERE a.rn=1
    

    赠送车牌号搜索:(总感觉有些别扭这句sql -_-)

    SELECT * FROM(
    SELECT 
        a.PLATE_NUMBER PLATE_NUMBER,
        a.OUT_TIME OUT_TIME
    FROM ( 
        SELECT 
        PLATE_NUMBER,
        OUT_TIME,
        ROW_NUMBER() OVER( PARTITION BY PLATE_NUMBER ORDER BY OUT_TIME DESC) rn 
        FROM CARTIMEINFO_OBD ) a WHERE a.rn=1
        )WHERE 1=1
            <if test="plateNumber!=null and plateNumber!=''">
                and PLATE_NUMBER=#{plateNumber}
            </if>
        ORDER BY OUT_TIME DESC
    

    //4.17
    mmp的,突然想到要获取最新的数据直接用SELECT * FROM CARTIMEINFO WHERE OUT_TIME = (SELECT max(OUT_TIME) FROM CARTIMEINFO_OBD)就可以获取了呀......,

    相关文章

      网友评论

        本文标题:分组排序row_number() over()函数

        本文链接:https://www.haomeiwen.com/subject/ijsdcftx.html