Sql Oracle联接两个表,其中联接到表返回联接(父?)表限制的结果集中最高的一个?

Sql Oracle联接两个表,其中联接到表返回联接(父?)表限制的结果集中最高的一个?,sql,oracle,join,Sql,Oracle,Join,对不起,标题太长了,但要把它浓缩成一个简短的标题是很困难的 我有两个表,一个自动维护日志表和一个自动跳闸日志表,如下所示: 自动维护日志: 自动识别码 维护日期时间 维护说明 自动跳闸日志: 自动识别码 行程时间 终点里程表 我需要为每个自动选择所有维护事件,对于每个事件,从行车日志表中查找维护时的最新结束里程表值。我成功完成此任务的唯一方法是使用一个函数(即get_里程表(auto_id,maint_datetime)作为我查询中的一列),在该函数中,对行程日志中的里程表读数进行评估,

对不起,标题太长了,但要把它浓缩成一个简短的标题是很困难的

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

自动维护日志:

  • 自动识别码
  • 维护日期时间
  • 维护说明
自动跳闸日志:

  • 自动识别码
  • 行程时间
  • 终点里程表
我需要为每个自动选择所有维护事件,对于每个事件,从行车日志表中查找维护时的最新结束里程表值。我成功完成此任务的唯一方法是使用一个函数(即get_里程表(auto_id,maint_datetime)作为我查询中的一列),在该函数中,对行程日志中的里程表读数进行评估,以提取传递的maint_datetime之前的最新行程,从而返回最新的结束里程表

虽然函数调用确实起作用,但在理论上,在实践中却不起作用。我的最终目标是创建一个维护数据视图,其中包括(当时的)当前里程表值,我有数百辆车的数百万维护行。函数调用的性能使其作为解决方案的使用变得不切实际,甚至不可能

我已经尝试了MAX、rownum、subselects、analytics(over/partition,等等)的所有变体,我已经能够从谷歌搜索到这些,但还不能编写一个有效的查询

欢迎您提出任何建议或精彩的解决方案


谢谢,

您可以使用相关子查询来完成此操作:

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()。@SuperDave。这只是一个简单的假设。您仍然可以使用
keep
子句来执行此操作。第二个查询可能返回多行。Gordon提供了一个很好的解决方案,下面是一个相关子查询,但我在最初的帖子中没有提到里程表数据的有效性总是有问题,因此我必须依赖最新的条目,而不仅仅是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;