日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

分组查询最晚一条数据(ORACLE)

發布時間:2023/12/10 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 分组查询最晚一条数据(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)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。