Ônibus e passageiros chegam a uma estação. Se um ônibus chegar à estação em um horário tbus
e um passageiro chegar em um horário tpassenger where tpassenger <= tbus
, o passageiro tentará usar o primeiro ônibus disponível cuja capacidade não tenha sido excedida.
Se no momento em que o ônibus chegar à estação houver mais passageiros esperando do que sua capacidade capacity
, apenas capacity
passageiros usarão o ônibus.
Desejo gerar os usuários que aparecem em cada ônibus (se dois passageiros chegarem ao mesmo tempo, o passageiro com o menor valor de passage_id deve ter prioridade).
Entrada:
Tabela de ônibus:
bus_id | tempo de chegada | capacidade |
---|---|---|
1 | 2 | 1 |
2 | 4 | 10 |
3 | 7 | 2 |
Mesa de passageiros:
id_passageiro | tempo de chegada |
---|---|
11 | 1 |
12 | 1 |
13 | 5 |
14 | 6 |
15 | 7 |
Saída:
bus_id | capacidade | b_chegada | ver | id_passageiro | p_chegada |
---|---|---|---|---|---|
1 | 1 | 2 | 1 | 11 | 1 |
2 | 10 | 4 | 1 | 12 | 1 |
2 | 10 | 4 | 2 | NULO | NULO |
2 | 10 | 4 | 3 | NULO | NULO |
2 | 10 | 4 | 4 | NULO | NULO |
2 | 10 | 4 | 5 | NULO | NULO |
2 | 10 | 4 | 6 | NULO | NULO |
2 | 10 | 4 | 7 | NULO | NULO |
2 | 10 | 4 | 8 | NULO | NULO |
2 | 10 | 4 | 9 | NULO | NULO |
2 | 10 | 4 | 10 | NULO | NULO |
3 | 2 | 7 | 1 | 13 | 5 |
3 | 2 | 7 | 2 | 14 | 6 |
Explicação:
O passageiro 11 chega no tempo 1.
O passageiro 12 chega no tempo 1.
O ônibus 1 chega no horário 2 e recolhe o passageiro 11, pois tem um assento vazio.
O ônibus 2 chega no horário 4 e recolhe o passageiro 12, pois tem dez lugares vazios.
O passageiro 13 chega no tempo 5.
O passageiro 14 chega no tempo 6.
O passageiro 15 chega no horário 7.
O ônibus 3 chega no horário 7 e recolhe os passageiros 13 e 14, pois tem dois assentos vazios.
DDL:
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)
Uma maneira de resolver isso é com o seguinte algoritmo:
Esse algoritmo pode ser implementado usando um CTE recursivo. Por exemplo:
Eu obtenho a saída desejada para seus dados de amostra:
Conforme implementado, essa abordagem provavelmente não funcionará bem em tabelas grandes. Uma maneira de melhorar o desempenho de tabelas maiores seria gravar algumas das CTEs em tabelas temporárias com índices apropriados.