Explicação da Tarefa Mapa de Assentos da Aeronave
Objetivo Principal da Tarefa
A tarefa consiste em criar um mapa visual de assentos para um modelo específico de aeronave (neste caso, 'Boeing 777-300'). O resultado deve ser uma lista de fileiras, onde para cada fileira e classe de serviço ('Business', 'Economy', 'Comfort') é mostrado um array de assentos disponíveis.
Por exemplo, para a 1ª fileira da classe executiva, pode parecer assim:
- Fileira: 1
- Assentos: ["A", "C", "D", "F"]
- Classe: Business
Lógica da Solução (Passo a Passo)
Passo 1: Selecionar a Aeronave Correta.
- Primeiramente, é necessário filtrar os dados para trabalhar apenas com os assentos pertencentes ao modelo 'Boeing 777-300'.
- Para isso, é preciso juntar a tabela
seats(assentos) com a tabelaaircrafts_data(dados das aeronaves) pelo campo comumaircraft_code. - Em seguida, na cláusula
WHERE, especificar o modelo de aeronave desejado.
Passo 2: Dividir o Número do Assento em Fileira e Letra.
- O número do assento na tabela
seatstem um formato como12A,30K, onde12é o número da fileira, eAé a letra do assento na fileira. - O número da fileira pode ser obtido removendo a parte da letra da string
seat_no. Por exemplo, usando a funçãortrimou expressões regulares. - A letra do assento pode ser obtida pegando o último caractere da string
seat_no(por exemplo, com a funçãoright).
- O número do assento na tabela
Passo 3: Agrupar os Assentos.
- A ideia principal é agrupar todos os assentos que estão na mesma fileira e pertencem à mesma classe de serviço (
fare_conditions). - Portanto, a cláusula
GROUP BYdeve incluir tanto o número da fileira calculado quanto a classe de serviço.
- A ideia principal é agrupar todos os assentos que estão na mesma fileira e pertencem à mesma classe de serviço (
Passo 4: Agregar as Letras dos Assentos em um Array.
- Para cada grupo (por exemplo, "fileira 10, classe econômica"), precisamos coletar todas as letras dos assentos (
A,B,C, etc.) em uma única lista ou array. - A função de agregação
json_agg(no PostgreSQL) é ideal para isso, pois cria um array JSON a partir dos valores. - Para garantir que os assentos no array estejam na ordem correta (A, B, C, e não C, A, B), é necessário adicionar uma ordenação dentro da função
json_agg.
- Para cada grupo (por exemplo, "fileira 10, classe econômica"), precisamos coletar todas as letras dos assentos (
Passo 5: Ordenação Final.
- Para que o mapa de assentos pareça lógico (fileiras indo da frente para trás da aeronave), o resultado final precisa ser ordenado pelo número da fileira.
Spoiler: a consulta SQL com a solução está oculta abaixo. Clique para revelar.
select
rtrim(seat_no, 'ABCDEFGHKJ')::int "row",
json_agg(right(seat_no, 1) order by right(seat_no, 1)) seats ,
fare_conditions
from seats
join aircrafts_data using(aircraft_code)
where aircrafts_data.model->>'en' = 'Boeing 777-300'
group by rtrim(seat_no, 'ABCDEFGHKJ'), fare_conditions
order by "row";