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

Posted

技术标签:

【中文标题】从两个表创建一个临时表,选择特定日期之前的最新日期【英文标题】:Create a temp table from two tables, selecting the latest date before a specific date 【发布时间】:2021-04-06 14:09:32 【问题描述】:

我有以下两张表

飞行表

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

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

【问题讨论】:

【参考方案1】:

一个选项使用子查询:

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

【讨论】:

【参考方案2】:

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

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

【讨论】:

以上是关于从两个表创建一个临时表,选择特定日期之前的最新日期的主要内容,如果未能解决你的问题,请参考以下文章

如何插入配置单元表,按从临时表读取的日期进行分区? [复制]

Oracle:将两个表与一个公共列加上第二个表中的一个附加列(最新生效日期)连接以选择其他列

SQL 中特定日期状态的动态数据透视表

将数据插入临时表

使用我指定的日期列创建查询,但无法创建临时表

加入两个表,只显示唯一值和最大日期