在查询优化的过程中,我得到了以下 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. DATA 对应最新的 check_dt 2. DATA 对应最新的inspection_dt。
一个简单的解决方案 - 只需编写两个单独的查询,其中一个条件是单一的 - 一个用于inspection_dt,一个用于check_dt。然而,这样就失去了最初的意图——缩短运行时间。
通过观察源数据,我注意到了实现它的方式——检查日期总是晚于检查日期;知道我可以只提取 rank = 1 的记录,它会给我对应于最新 CHECK_DT 的 DATA,而具有最大等级的记录将对应于 INSPECTION。但是,数据恐怕数据不会总是一致的,所以我一直在寻找更抽象的解决方案。