【问题标题】: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  
);

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

【问题讨论】:

    标签: mysql sql datetime subquery greatest-n-per-group


    【解决方案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'
                            );
      

      【讨论】:

        猜你喜欢
        • 2023-03-10
        • 1970-01-01
        • 2021-03-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-05-20
        相关资源
        最近更新 更多