从两个 table 创建临时 table,选择特定日期之前的最新日期

Create a temp table from two tables, selecting the latest date before a specific date

我有以下两个table

航班表

| passenger_id | flight_date       | flight_number  | destination  | 
| -------------| ----------        | -------------- | ------------ |
| 1234         | 2020-12-16        | 534            | CA           |
| 1234         | 2020-12-29        | 876            | FL           |
| 1234         | 2020-11-13        | 938            | FL           |
| 5678         | 2020-12-27        | 986            | MN           |
| 5678         | 2020-11-19        | 347            | WA           |

乘客表

| passenger_id | company_name | phone_number   | 
| -------------| ------------ | ------------   |
| 1234         | Verizon      | (555) 874-9232 |
| 5678         | AT&T         | (555) 867-5309 |

我想创建一个临时 table,其中包含来自两个 table 的特定列,但只包含来自 FlightTable 的具有最新的行flight_date 发生在 2020-12-28 之前,每位乘客。结果 table 应如下所示:

临时表

| passenger_id | company_name |flight_number  | destination  | 
| -------------| ------------ |------------   | ------------ |         
| 1234         | Verizon      |534            | CA           |
| 5678         | AT&T         |986            | MN           |

我试过以下查询但没有成功:

CREATE TEMPORARY TABLE TempTable AS (
SELECT F.passenger_id, P.company_name, flight_number, destination
FROM FlightTable AS F, PassengerTable AS P
WHERE '2020-12-28' <= MAX(flight_date) AND F.passenger_id = P.passenger_id  
);

如何修改它才能按预期工作?

一个选项使用子查询:

select p.passenger_id, p.company_name, f.flight_number, f.destination
from passenger p
inner join flight f on f.passenger_id = p.passenger_id
where f.flight_date = (
    select max(f1.flight_date)
    from flight f1
    where f1.passenger_id = f.passenger_id and f1.flight_date < '2020-12-28'
)

或者,您可以使用 window 函数:

select p.passenger_id, p.company_name, f.flight_number, f.destination
from passenger p
inner join (
    select f.*,
        rank() over(partition by passenger_id order by flight_date desc) rn
    from flight f
    where flight_date < '2020-12-28'
) f on f.passenger_id = p.passenger_id
where rn = 1

首先,学习使用正确的 JOIN 语法。然后,您可以使用相关子查询 select 截止日期之前的最近日期:

SELECT F.passenger_id, P.company_name, f.flight_number, f.destination
FROM FlightTable F JOIN
     PassengerTable P
     ON F.passenger_id = P.passenger_id  
WHERE f.flight_date = (SELECT MAX(f2.flight_date) 
                       FROM FlightTable f2
                       WHERE f2.passenger_id = f.passenger_id AND
                             f2.flight_date < '2012-12-28'
                      );