题目描述

(通过次数1,007 | 提交次数1,479,通过率68.09%)

表: Flights
+-------------------+------+
| Column Name       | Type |
+-------------------+------+
| departure_airport | int  |
| arrival_airport   | int  |
| flights_count     | int  |
+-------------------+------+
(departure_airport, arrival_airport) 是该表的主键列。
该表的每一行都表示从 departure_airport 出发并到达 arrival_airport 的 flights_count 航班。

编写一个 SQL 来查询流量最大的机场的 ID。客流量最大的机场是指从该机场起飞或抵达该机场的航班总数最多的机场。如果有多个机场流量最大,请全部查询出来。
以任意顺序返回结果表。

查询结果格式如下所示。
示例 1:
输入: 
Flights 表:
+-------------------+-----------------+---------------+
| departure_airport | arrival_airport | flights_count |
+-------------------+-----------------+---------------+
| 1                 | 2               | 4             |
| 2                 | 1               | 5             |
| 2                 | 4               | 5             |
+-------------------+-----------------+---------------+
输出: 
+------------+
| airport_id |
+------------+
| 2          |
+------------+
解释: 
1 号机场有 9 个航班 (4 个出发, 5 个到达).
2 号机场有 14 个航班 (10 个出发, 4 个到达).
4 号机场有 5 个航班 (5 个到达).
客流量最大的机场是 2 号机场。
示例2:
输入: 
Flights 表:
+-------------------+-----------------+---------------+
| departure_airport | arrival_airport | flights_count |
+-------------------+-----------------+---------------+
| 1                 | 2               | 4             |
| 2                 | 1               | 5             |
| 3                 | 4               | 5             |
| 4                 | 3               | 4             |
| 5                 | 6               | 7             |
+-------------------+-----------------+---------------+
输出: 
+------------+
| airport_id |
+------------+
| 1          |
| 2          |
| 3          |
| 4          |
+------------+
解释: 
1 号机场有 9 个航班 (4 个出发, 5 个到达).
2 号机场有 9 个航班 (5 个出发, 4 个到达).
3 号机场有 9 个航班 (5 个出发, 4 个到达).
4 号机场有 9 个航班 (5 个出发, 4 个到达).
5 号机场有 7 个航班 (7 个出发).
6 号机场有 7 个航班 (7 个到达).
流量最大的机场是机场 1、2、3 和 4。

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/the-airport-with-the-most-traffic
//测试数据
Create table If Not Exists Flights (departure_airport int, arrival_airport int, flights_count int);

insert into Flights (departure_airport, arrival_airport, flights_count) values ('1', '2', '4');
insert into Flights (departure_airport, arrival_airport, flights_count) values ('2', '1', '5');
insert into Flights (departure_airport, arrival_airport, flights_count) values ('2', '4', '5');

解题思路

Flights表保存了所有航线的航班数。起飞和降落的两个机场形成一个航线。并且在计算机场的流量时,机场作为起飞点和降落点的航班都需要计算在内。
那么,既然我们要计算流量最大的机场,首先就需要计算出每个机场的流量。
对于某机场来说,需要将该机场作为起飞机场的航班数和降落机场的航班数加起来。
可以使用UNION ALL合并起飞航班数和降落航班数,然后再分组统计。
最后根据航班数排序,取出航班数最大的机场即可。使用开窗排序函数可以实现。

参考SQL

未特别说明的情况下,参考SQL为基于MySQL8.0实现。
with
tmp as (
    select
        departure_airport airport_id,
        flights_count
    from Flights
    union all
    select
        arrival_airport airport_id,
        flights_count
    from Flights
)
select
    b.airport_id
from (
    select
        a.airport_id,
        rank() over(order by a.flights_count desc) rk
    from (
        select
            airport_id,
            sum(flights_count) flights_count
        from tmp
        group by airport_id
    )a
)b
where b.rk = 1;
picture loss