Greatest-N-per-Group
使用解析函式的sql查詢
桌子佈置得像
名稱、id、attr1、attr2、data_date a, 1, 薩爾斯, ksdjf, 05-25-2018 b, 1, laskd, lskd, 05-20-2017 c, 2, klss, kjfe, 03-20-2018 d, 2, 國家養老金 , lww , 02-10-2018 .....
從 table1 中選擇名稱、id、attr1、attr2、data_date (id,data_date)在哪裡 (select id, max(data_date) from table1 group by id)
上述查詢有效。基本上對於每個 ID,我想選擇具有 max(data_date) 的行。我相信分析函式有更好的方法。
我的查詢結果應該是
名稱、id、attr1、attr2、data_date a, 1, sals, ksdjf,05-25-2018 c, 2, klss, kjfe, 03-20-2018
感謝任何幫助以更好地重寫它。謝謝你。
我相信這是您正在尋找的,使用視窗函式:
select name, id, attr1, attr2, max(data_date) over (partition by id) as maxdata_date from table1
結果:
name id attr1 attr2 maxdata_date a 1 sals ksdjf 2018-05-25 b 1 laskd lskd 2018-05-25 c 2 klss kjfe 2018-03-20 d 2 aow lww 2018-03-20
您可以使用以下命令列舉按 data_date 排序的每個 id 的行
ROW_NUMBER()
:select name, id, attr1, attr2 , row_number() over (partition by id order by data_date desc) as rn from table1
然後在每個分區中選擇第一個:
select name, id, attr1, attr2, data_date from ( select name, id, attr1, attr2 , row_number() over (partition by id order by data_date desc) as rn from table1 ) as t where rn = 1;
請注意, order by 是 desc ,因為您想要最後一個。一個常見的錯誤是按升序排序並選擇每個分區中的最後一個,但這是低效的。