题目描述

(通过次数976 | 提交次数1,970,通过率49.54%)

表: Buses
+--------------+------+
| Column Name  | Type |
+--------------+------+
| bus_id       | int  |
| arrival_time | int  |
+--------------+------+
bus_id 是该表的主键。
该表的每一行都包含关于 LeetCode 站点的公交车到达时间的信息。
不会出现两辆公交车会同时到达。
表: Passengers
+--------------+------+
| Column Name  | Type |
+--------------+------+
| passenger_id | int  |
| arrival_time | int  |
+--------------+------+
passenger_id 是该表的主键。
该表的每一行都包含乘客到达 LeetCode 站的时间信息。
公交车和乘客到达 LeetCode 站。如果一辆公交车在时间 tbus 到站,乘客在时间 tpassenger 到站,其中 tpassenger <= tbus,该乘客之前没有赶上任何公交车,则该乘客将搭乘该公交车。
编写一个 SQL 来查询使用每条总线的用户数量。
返回按 bus_id 升序排序的结果表。
查询结果格式如下所示。
示例 1:
输入: 
Buses 表:
+--------+--------------+
| bus_id | arrival_time |
+--------+--------------+
| 1      | 2            |
| 2      | 4            |
| 3      | 7            |
+--------+--------------+
Passengers 表:
+--------------+--------------+
| passenger_id | arrival_time |
+--------------+--------------+
| 11           | 1            |
| 12           | 5            |
| 13           | 6            |
| 14           | 7            |
+--------------+--------------+
输出: 
+--------+----------------+
| bus_id | passengers_cnt |
+--------+----------------+
| 1      | 1              |
| 2      | 0              |
| 3      | 3              |
+--------+----------------+
解释: 
- 11 号乘客在时间 1 到达。
- 1 号公交车到达时间为 2,搭载 11 号乘客。
- 2 号公交车车在时间 4 到达,没有乘客。
- 12 号乘客在时间 5 到达。
- 13 号乘客在时间 6 到达。
- 14 号乘客在时间 7 到达。
- 3 号车在时间 7 到达,搭载 12、13、14 号乘客。
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/the-number-of-passengers-in-each-bus-i
//测试数据
Create table If Not Exists Buses (bus_id int, arrival_time int);
Create table If Not Exists Passengers (passenger_id int, arrival_time int);

insert into Buses (bus_id, arrival_time) values ('1', '2');
insert into Buses (bus_id, arrival_time) values ('2', '4');
insert into Buses (bus_id, arrival_time) values ('3', '7');

insert into Passengers (passenger_id, arrival_time) values ('11', '1');
insert into Passengers (passenger_id, arrival_time) values ('12', '5');
insert into Passengers (passenger_id, arrival_time) values ('13', '6');
insert into Passengers (passenger_id, arrival_time) values ('14', '7');

解题思路

Buses表保存了所有到达站点的公交车及到达时间。
Passengers表保存了所有到达站点的乘客及到达时间。
乘客到达站点后等待公交车到达,乘客默认会乘坐第一个到达的公交车。
题目要求:计算每趟公交车在该站点有多少乘客上车。
很明显,对于乘客来说,若乘客在时间t到达站点,那么该乘客乘坐的公交车一定为在时间t之后第一个到达站点(到达时间最小)的公交车。
所以,我们可以从乘客出发,计算出每个乘客乘坐的公交车的到达时点。
最后,按公交车ID汇总统计乘客的数量即可。

参考SQL

未特别说明的情况下,参考SQL为基于MySQL8.0实现。
select
    c.bus_id,
    count(d.arrival_time) passengers_cnt
from Buses c
left join (
    select
        a.passenger_id,
        min(b.arrival_time) arrival_time
    from Passengers a
    inner join Buses b
    on a.arrival_time <= b.arrival_time
    group by a.passenger_id
)d
on c.arrival_time = d.arrival_time
group by c.bus_id
order by c.bus_id;
picture loss