函數(shù)作用:用于分組排序。
這里有一張車輛出車信息表:CARTIMEINFO_OBD帅刊,
任務:查詢出每輛車最新出車時間。
效果圖.png
分析:思路很簡單赖瞒,我們只需要對每輛車車牌號進行分組,分組后取最新OUT_TIME就可以了蚤假。
問題:一開始我在mysql數(shù)據(jù)庫中直接通過group by plate_number order by out_time有數(shù)據(jù)并且是分組了栏饮,但是出車的時間確實最早的,這并不是我們想要的效果磷仰。我在orcale數(shù)據(jù)庫中同樣適用上述語句查詢袍嬉,結(jié)果查詢語句不正確.....
首先需要理解row_number() over()這個函數(shù)的用法,看下面sql:
SELECT
PLATE_NUMBER,
OUT_TIME,
ROW_NUMBER() OVER( PARTITION BY PLATE_NUMBE ORDER BY OUT_TIME DESC) rn
FROM CARTIMEINFO_OBD
over()中關(guān)鍵詞PARTITION BY:以PLATE_NUMBER(車牌號)分組灶平,
ORDER BY:這個跟容易理解伺通,就是排序,當然這里是分組后進行排序逢享,
這里的RN就是每組的排序了(-_- )罐监。
該sql查詢后如圖:
分組排序后.png
以上初步解決了怎么分組和排序的問題,接下來只需要通過RN取出我們需要的數(shù)據(jù)了瞒爬,這里我只需要取出最新出車時間弓柱,在函數(shù)中我們通過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的矢空,突然想到要獲取最新的數(shù)據(jù)直接用SELECT * FROM CARTIMEINFO WHERE OUT_TIME = (SELECT max(OUT_TIME) FROM CARTIMEINFO_OBD)就可以獲取了呀......航罗,