Greatest-N-per-Group

使用解析函式的sql查詢

  • June 2, 2018

桌子佈置得像

名稱、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

http://sqlfiddle.com/#!18/109b5/1

您可以使用以下命令列舉按 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 ,因為您想要最後一個。一個常見的錯誤是按升序排序並選擇每個分區中的最後一個,但這是低效的。

引用自:https://dba.stackexchange.com/questions/208543