res_id(uuid),
memo(text),
memo_timestamp(timestamp)
からなるテーブル(memo_table)があるとします。
res_idごとに複数のmemoがあり、memo_timestampが最新の行のみを抽出したいとき、下記のようにSQLを書いてみました。


select
  res_id
  , max(memo)
from
  (select
     res_id
     , memo
     , first_value(memo)
         over (
           partition by res_id
           order by memo_timestamp desc
         )
   from memo_table
  ) as tablex
group by res_id
;

ちなみに、無駄にrank()を使った下記のようなSQLも書いてみましたが、やはりfirst_value()を使った方が速いようです。
ただ、こちらの方が2番目のレコードを抽出することなどができるため、特殊な用途ではよいのかもしれません。


select
  res_id
  , memo
from
  (select
     res_id
     , memo
     , rank()
         over (
           partition by res_id
           order by memo_timestamp desc
         ) as rnk
   from memo_table
  ) as tablex
where rnk = 1
;