对于长标题感到抱歉,但这是一个难以进入简短标题的困境..: - )
我有两个表,一个自动维护日志表和一个自动旅行日志表,如下所示:
auto_maint_log:
auto_trip_log:
我需要为每个自动选择所有维护事件,并且对于每个事件,从行程日志表中查找维护时的最新ending_odometer值。我成功完成此任务的唯一方法是使用一个函数(即get_odometer(auto_id,maint_datetime)作为我的查询中的一列),其中评估行程日志中的里程表读数,以便在通过maint_datetime之前拉出最近的行程,从而返回最近的ending_odometer。
虽然函数调用确实有效,但从理论上讲,它实际上并没有。我的最终目标是创建一个包含(当时)当前里程表值的维护数据视图,并且我在数百辆车辆上拥有数百万个维护行。函数调用的性能使其作为解决方案的使用不切实际,不可能......: - )
我已经尝试了MAX,rownum,subselects,analytics(over / partition等)的所有变体。我已经能够从谷歌搜索到这一点,并且无法编写有效的查询代码。< / p>
欢迎任何建议或精彩的解决方案!
谢谢,
答案 0 :(得分:1)
您可以使用相关子查询执行此操作:
select aml.*,
(select max(atl.ending_odometer)
from auto_trip_log atl
where alt.auto_id = aml.auto_id and
atl.trip_datetime <= aml.maint_datetime
) as ending_odometer
from auto_maint_log aml;
此查询使用max()
,因为(可能)里程表读数正在稳步增加。
编辑:
select aml.*,
(select max(atl.ending_odometer) over (dense_rank first order by atl.trip_datetime desc)
from auto_trip_log atl
where alt.auto_id = aml.auto_id and
atl.trip_datetime <= aml.maint_datetime
) as ending_odometer
from auto_maint_log aml;