在查询优化过程中,我得遵循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对应的数据。
其中一个简单的解决方案 - 只需编写两个单独的查询,其中一个用于inspection_dt,另一个用于check_dt。但是,这样就失去了初始意图 - 缩短了运行时间。
通过观察源数据,我注意到了实现它的方法 - 检查日期总是晚于检查日期;知道我可以只提取rank = 1的记录,它会给我对应最新CHECK_DT的DATA,而最大排名的记录将对应于INSPECTION。 但是,我害怕数据的数据并不总是一致的,所以我一直在寻找更抽象的解决方案。
答案 0 :(得分:1)
这个怎么样?
select s.*
from (select id, DATA, update_dt, inspection_dt, check_dt,
RANK() OVER (PARTITION by ID
ORDER BY update_dt DESC, DATA
) as rank_upd,
RANK() OVER (PARTITION by ID
ORDER BY inspection_dt DESC, DATA
) as rank_insp,
FROM TABLE
) r
where r.rank_upd = 1 or r.rank_insp = 1;