从两个 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'
);
我有以下两个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'
);