分组查询最晚一条数据(ORACLE)
生活随笔
收集整理的這篇文章主要介紹了
分组查询最晚一条数据(ORACLE)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
現有客戶表,交費表,需查詢每個存在交費記錄客戶的最后一筆交費信息
這里提供兩種方式
注:客戶不會在同一時間有兩條交費,SQL可直接執行
--查詢客戶名稱,最后一筆交費時間,以及最后一筆交費金額 WITH --客戶表:客戶id,客戶名稱 a AS( SELECT 'a1' aid, '張三' aname FROM dual UNION ALL SELECT 'a2', '李四' FROM dual UNION ALL SELECT 'a3', '王五' FROM dual ), --交費表:交費ID,客戶ID,交費時間(以數字代替,數字越大時間越晚),交費金額 b AS( SELECT 'b1' bid,'a1' aid, '1' btime, 10 bnum FROM dual UNION ALL SELECT 'b2','a1', '2',30 FROM dual UNION ALL SELECT 'b3', 'a1', '3',40 FROM dual UNION ALL SELECT 'b4', 'a2', '1',40 FROM dual UNION ALL SELECT 'b5', 'a2', '3',60 FROM dual UNION ALL SELECT 'b6', 'a3', '1',50 FROM dual ) --方式一:子查詢 /*SELECT a.aname,b1.bnum,b1.btime FROM b b1 JOIN (SELECT b.aid,MAX(b.btime) btimeFROM b GROUP BY b.aid) b2 ON b2.aid = b1.aid AND b2.btime = b1.btime JOIN a ON b1.aid = a.aid ORDER BY 1,2,3 */ --方式二:分析函數 /*SELECT aname,bnum,btime FROM ( SELECT a.aname,b.bnum,b.btime, row_number() OVER (partition by b.aid order by b.btime desc) rn FROM b JOIN a ON a.aid = b.aid ) WHERE rn = 1 ORDER BY 1,2,3 --方式三:NOT EXISTS SELECT a.aname,b.bnum,b.btime FROM a JOIN b ON b.aid = a.aid AND NOT EXISTS( SELECT 1 FROM b b1 WHERE b1.aid = b.aid AND b1.btime > b.btime) ORDER BY 1,2,3*/ --方式四:開窗函數 SELECT DISTINCT a.aname, first_value(b.bnum) OVER (partition by b.aid order by b.btime DESC) bnum, last_value(b.btime) OVER (partition by b.aid) btime FROM b JOIN a ON a.aid = b.aid ORDER BY 1,2,3查詢結果如下
first_value和last_value用法不同可以參照
Oracle分析函數之FIRST_VALUE和LAST_VALUE
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的分组查询最晚一条数据(ORACLE)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 织梦dedecms蓝色培训机构模板教育学
- 下一篇: 第十八期:网页禁止复制粘贴怎么办?教你六