题目描述
(通过次数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;
本站所有内容均为原创,本站保留所有权利。仅允许非商业用途的转载,但必须注明来源网站、作者、来源链接!否则,由此造成的一切后果,由转载方承担!
干货分享、技术提升、面试笔试、学习交流,欢迎关注公众号:xuesql。QQ学习交流群:209942678。