连接到表的两个表的Oracle连接返回由连接(父?)表限制的结果集的最高值?

时间:2014-11-18 14:17:43

标签: sql oracle join

对于长标题感到抱歉,但这是一个难以进入简短标题的困境..: - )

我有两个表,一个自动维护日志表和一个自动旅行日志表,如下所示:

auto_maint_log:

  • auto_id
  • maint_datetime
  • maint_description

auto_trip_log:

  • auto_id
  • trip_datetime
  • ending_odometer

我需要为每个自动选择所有维护事件,并且对于每个事件,从行程日志表中查找维护时的最新ending_odometer值。我成功完成此任务的唯一方法是使用一个函数(即get_odometer(auto_id,maint_datetime)作为我的查询中的一列),其中评估行程日志中的里程表读数,以便在通过maint_datetime之前拉出最近的行程,从而返回最近的ending_odometer。

虽然函数调用确实有效,但从理论上讲,它实际上并没有。我的最终目标是创建一个包含(当时)当前里程表值的维护数据视图,并且我在数百辆车辆上拥有数百万个维护行。函数调用的性能使其作为解决方案的使用不切实际,不可能......: - )

我已经尝试了MAX,rownum,subselects,analytics(over / partition等)的所有变体。我已经能够从谷歌搜索到这一点,并且无法编写有效的查询代码。< / p>

欢迎任何建议或精彩的解决方案!

谢谢,

1 个答案:

答案 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;