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
;