从两个表创建一个临时表,选择特定日期之前的最新日期
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'
);
【讨论】:
以上是关于从两个表创建一个临时表,选择特定日期之前的最新日期的主要内容,如果未能解决你的问题,请参考以下文章
如何插入配置单元表,按从临时表读取的日期进行分区? [复制]