首页 > 解决方案 > 从两个表创建一个临时表,选择特定日期之前的最新日期

问题描述

我有以下两张表

飞行表

| 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 |

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

临时表

| 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  
);

如何修改它以按预期工作?

标签: mysqlsqldatetimesubquerygreatest-n-per-group

解决方案


一个选项使用子查询:

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'
)

或者,您可以使用窗口函数:

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

推荐阅读