在同一个表上连接两个不同聚合函数的结果

djl*_*ley 6 sql

我正在尝试组合两个查询,以便确定在特定时间(2011-09-19 04:00:00.000)之前哪个飞机将在特定点(点ABCD).到目前为止,我生成了最后一架飞机到达这一点,以及飞机最后一次离开该点.我目前的想法是,如果它最后一次到达的时间大于它最后一次离开飞机仍然在指定时间之前的ABCD点.

第一个查询查找飞机最后一次到达某个点:

select aircraft_id, MAX(arrival_datetime) as last_arrival
from flight_schedule
where arrival_datetime < '2011-09-19 04:00:00.000' and arrival_point='ABCD'
group by aircraft_id
Run Code Online (Sandbox Code Playgroud)

第二个查询找到飞机最后一次离开这一点:

select aircraft_id, MAX(departure_datetime) as last_departure
from flight_schedule
where departure_datetime < '2011-09-19 04:00:00.000' and departure_point='ABCD'
group by aircraft_id
Run Code Online (Sandbox Code Playgroud)

这两个查询都会生成相应的响应.我意识到为了比较last_departure和last_arrival字段,我需要以某种方式加入表.

我不是一个SQL专家,在过去任何表连接我已经完成了两个完全不同的表之间并没有涉及任何聚合函数所以我的正常子查询和结构没有工作.

Lie*_*ers 6

最简单的解决方案是

  • 将每个语句转换为子查询
  • 一起加入结果

SQL语句

select la.aircraft_id, la.last_arrival, ld.last_departure
from  (
    select aircraft_id, MAX(arrival_datetime) as last_arrival
    from flight_schedule
    where arrival_datetime < '2011-09-19 04:00:00.000' and arrival_point='ABCD'
    group by aircraft_id
  ) la
  full outer join (
    select aircraft_id, MAX(departure_datetime) as last_departure
    from flight_schedule
    where departure_datetime < '2011-09-19 04:00:00.000' and departure_point='ABCD'
    group by aircraft_id
  ) ld on ld.aircraft_id = la.aircraft_id
Run Code Online (Sandbox Code Playgroud)

请注意,我使用过full outer join.最有可能inner join就足够了.该full outer join如果有过一个只需要arival_datetime没有departure_datetime,反之亦然(至极是不太可能发生).