力扣题目跳转(2142. 每辆车的乘客人数 I - 力扣(LeetCode))
表:
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 号乘客。
case 1 的建表语句。
Create table If Not Exists Buses (bus_id int, arrival_time int)
Create table If Not Exists Passengers (passenger_id int, arrival_time int)
Truncate table Buses
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')
Truncate table Passengers
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')
一 我们增加一列作为 bus 的前一辆到达时间 dtc 。
select *, ifnull(lag(arrival_time ) over (),0) as dtc from buses order by arrival_time
输出如下
二 我们将上面的表作为 t 与 passenger p 表进行连接,条件为 p 表的到达时间为 dtc 和 t 表的到达时间之间。
select * from (select *, ifnull(lag(arrival_time ) over (),0) as dtc from buses order by arrival_time) t ,passengers p where p.arrival_time > dtc and p.arrival_time <= t.arrival_time;
输出如下
最后我们再将上面的表和 buses 表进行左连接,buses 表为主表。最后分组聚合排序即可。
with tmp as (select * from (select bus_id, arrival_time as at, ifnull(lag(arrival_time ) over (),0) as dtc from buses order by arrival_time) t ,passengers p where p.arrival_time > dtc and p.arrival_time <= at) select b.bus_id, count(at) as passengers_cnt from buses b left join tmp as t on b.bus_id = t.bus_id group by b.bus_id order by bus_id;
以上就是全部答案,如果对你有帮助请点个赞,谢谢。
来源:力扣(leecode)
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
转载请注明出处:
我会尽快把力扣上的所有数据库题目发出来。感兴趣的可以点个赞与关注。每天不定时跟新。