2142. 每辆车的乘客人数 I

力扣题目跳转(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

著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

 转载请注明出处:

2142. 每辆车的乘客人数 I-CSDN博客来源:力扣(leecode著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。转载请注明出处:我会尽快把力扣上的所有数据库题目发出来。每天不定时跟新。https://blog.csdn.net/CYJ1844/article/details/143723794

我会尽快把力扣上的所有数据库题目发出来。感兴趣的可以点个赞与关注。每天不定时跟新。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值