🙏 感谢您的支持! 我们在七月份已经筹集了 $65 — 这足够我们工作到下个月。请帮助我们保持进度,进一步支持这个项目。 支持这个项目 →
SQL 代码已复制到剪贴板

飞机座位图任务的解释

任务的主要目标

任务是为特定的飞机型号(在本例中为 'Boeing 777-300')创建一个可视化座位图。结果应该是一个行的列表,对于每一行和服务等级('商务', '经济', '舒适'),显示可用座位的数组。

例如,对于商务舱的第1行,它可能看起来像这样:

  • 行: 1
  • 座位: ["A", "C", "D", "F"]
  • 等级: 商务

解决逻辑(逐步)

  1. 步骤 1:选择正确的飞机。

    • 首先,您需要过滤数据,仅处理属于 'Boeing 777-300' 型号的座位。
    • 为此,您需要将 seats 表与 aircrafts_data 表在公共字段 aircraft_code 上连接。
    • 然后,在 WHERE 子句中指定所需的飞机型号。
  2. 步骤 2:将座位号拆分为行和字母。

    • seats 表中的座位号格式类似于 12A, 30K,其中 12 是行号,A 是该行的座位字母。
    • 行号 可以通过从 seat_no 字符串中去掉字母部分来获得。例如,使用 rtrim 函数或正则表达式。
    • 座位字母 可以通过从 seat_no 字符串中获取最后一个字符来获得(例如,使用 right 函数)。
  3. 步骤 3:对座位进行分组。

    • 主要思想是将所有在同一行且属于同一服务等级fare_conditions)的座位进行分组。
    • 因此,GROUP BY 子句必须包括计算出的行号和服务等级。
  4. 步骤 4:将座位字母聚合为数组。

    • 对于每个组(例如,“第10行,经济舱”),我们需要将所有座位字母(A, B, C 等)收集到一个单一的列表或数组中。
    • 聚合函数 json_agg(在 PostgreSQL 中)非常适合此目的,因为它从值创建一个 JSON 数组。
    • 为确保数组中的座位按正确顺序(A, B, C,而不是 C, A, B),必须在 json_agg 函数内部添加排序。
  5. 步骤 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";