クエリの最適化の過程で、次の SQL クエリにたどり着きました。
select s.*
from
(
select id, DATA, update_dt, inspection_dt, check_dt
RANK OVER()
(PARTITION by ID
ORDER BY update_dt DESC, DATA) rank
FROM TABLE
where update_dt < inspection_dt or update_dt < check_dt
) r
where r.rank = 1
クエリは、最新の check_dt に対応する DATA を返します。ただし、取得したいのは次のとおりです。1.最新のcheck_dtに対応するDATA 2.最新のinspection_dtに対応するDATA。
簡単な解決策の 1 つ - where 単一条件で 2 つの別個のクエリを作成するだけです。1 つは inspect_dt 用で、もう 1 つは check_dt 用です。ただし、そうすると、実行時間を短縮するという当初の意図が失われます。
ソースデータを観察することで、それを実装する方法に気づきました-チェック日は常に検査日よりも後です。ランク= 1のレコードを抽出するだけで、最新のCHECK_DTに対応するDATAが得られ、最大ランクのレコードがINSPECTIONに対応することを知っています。ただし、データは常に一貫しているとは限らないのではないかと心配しているため、より抽象的な解決策を探していました。