函数作用:用于分组排序。
这里有一张车辆出车信息表:CARTIMEINFO_OBD,
任务:查询出每辆车最新出车时间。
分析:思路很简单,我们只需要对每辆车车牌号进行分组,分组后取最新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查询后如图:
以上初步解决了怎么分组和排序的问题,接下来只需要通过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)就可以获取了呀......,