飞机座位图任务的解释
任务的主要目标
任务是为特定的飞机型号(在本例中为 'Boeing 777-300')创建一个可视化座位图。结果应该是一个行的列表,对于每一行和服务等级('商务', '经济', '舒适'),显示可用座位的数组。
例如,对于商务舱的第1行,它可能看起来像这样:
- 行: 1
- 座位: ["A", "C", "D", "F"]
- 等级: 商务
解决逻辑(逐步)
步骤 1:选择正确的飞机。
- 首先,您需要过滤数据,仅处理属于 'Boeing 777-300' 型号的座位。
- 为此,您需要将
seats表与aircrafts_data表在公共字段aircraft_code上连接。 - 然后,在
WHERE子句中指定所需的飞机型号。
步骤 2:将座位号拆分为行和字母。
seats表中的座位号格式类似于12A,30K,其中12是行号,A是该行的座位字母。- 行号 可以通过从
seat_no字符串中去掉字母部分来获得。例如,使用rtrim函数或正则表达式。 - 座位字母 可以通过从
seat_no字符串中获取最后一个字符来获得(例如,使用right函数)。
步骤 3:对座位进行分组。
- 主要思想是将所有在同一行且属于同一服务等级(
fare_conditions)的座位进行分组。 - 因此,
GROUP BY子句必须包括计算出的行号和服务等级。
- 主要思想是将所有在同一行且属于同一服务等级(
步骤 4:将座位字母聚合为数组。
- 对于每个组(例如,“第10行,经济舱”),我们需要将所有座位字母(
A,B,C等)收集到一个单一的列表或数组中。 - 聚合函数
json_agg(在 PostgreSQL 中)非常适合此目的,因为它从值创建一个 JSON 数组。 - 为确保数组中的座位按正确顺序(A, B, C,而不是 C, A, B),必须在
json_agg函数内部添加排序。
- 对于每个组(例如,“第10行,经济舱”),我们需要将所有座位字母(
步骤 5:最终排序。
- 为了使座位图看起来合乎逻辑(行从飞机前部到后部),最终结果需要按行号排序。
剧透:解决方案的 SQL 查询隐藏在下面。点击以显示。
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";