公共汽车和乘客到达车站。如果公共汽车在某个时间到达车站tbus
并且乘客在某个时间到达tpassenger where tpassenger <= tbus
,那么乘客将尝试使用第一辆可用的未超过载客量的公共汽车。
如果在公交车到达车站的那一刻等待的乘客多于其容量capacity
,则只有capacity
乘客会乘坐公交车。
我想输出出现在每辆公交车上的用户(如果有两个乘客同时到达,那么应该优先考虑passenger_id值较小的乘客)。
输入:
巴士表:
bus_id | 到达时间 | 容量 |
---|---|---|
1个 | 2个 | 1个 |
2个 | 4个 | 10 |
3个 | 7 | 2个 |
乘客表:
passenger_id | 到达时间 |
---|---|
11 | 1个 |
12 | 1个 |
13 | 5个 |
14 | 6个 |
15 | 7 |
输出:
bus_id | 容量 | b_arrival | 点 | passenger_id | p_arrival |
---|---|---|---|---|---|
1个 | 1个 | 2个 | 1个 | 11 | 1个 |
2个 | 10 | 4个 | 1个 | 12 | 1个 |
2个 | 10 | 4个 | 2个 | 无效的 | 无效的 |
2个 | 10 | 4个 | 3个 | 无效的 | 无效的 |
2个 | 10 | 4个 | 4个 | 无效的 | 无效的 |
2个 | 10 | 4个 | 5个 | 无效的 | 无效的 |
2个 | 10 | 4个 | 6个 | 无效的 | 无效的 |
2个 | 10 | 4个 | 7 | 无效的 | 无效的 |
2个 | 10 | 4个 | 8个 | 无效的 | 无效的 |
2个 | 10 | 4个 | 9 | 无效的 | 无效的 |
2个 | 10 | 4个 | 10 | 无效的 | 无效的 |
3个 | 2个 | 7 | 1个 | 13 | 5个 |
3个 | 2个 | 7 | 2个 | 14 | 6个 |
解释:
乘客 11 在时间 1 到达。
乘客 12 在时间 1 到达。
公共汽车 1 在时间 2 到达并接载乘客 11,因为它有一个空座位。
公共汽车 2 在时间 4 到达并接载乘客 12,因为它有 10 个空座位。
乘客 13 在时间 5 到达。
乘客 14 在时间 6 到达。
乘客 15 在时间 7 到达。
公共汽车 3 在时间 7 到达并接载乘客 13 和 14,因为它有两个空座位。
动态链接库:
create table buses(id int, arrival_time int, capacity int)
insert into buses values(1,2,1),(2,4,10),(3,7,2)
create table passengers (passenger_id int, arrival_time int)
insert into passengers values(11,1),(12,1),(13,5),(14,6),(15,7)
解决此问题的一种方法是使用以下算法:
该算法可以使用递归 CTE 来实现。例如:
我得到了您的示例数据所需的输出:
实施时,这种方法不太可能对大型表执行良好。提高较大表性能的一种方法是将一些 CTE 写入具有适当索引的临时表。