n:m关系中的SQL聚合函数

n:m关系中的SQL聚合函数,sql,entity-relationship,Sql,Entity Relationship,该域是一个航空公司预订系统。用户可以预订航班。航班由一条或多条航段组成 ┌─────┐ ┌──────┐ ┌───────┐ │ Leg ├────────┤Flight├──────┤Booking│ └─────┘ * * └──────┘1 * └───────┘ 要向用户显示有效航班的列表,系统必须查明航班是否有可用的免费座位。最大可用座位作为字段存储在Leg表中。预订的座位存储在Booking中 航班可能由多条航段组成。例如,可能有3个航

该域是一个航空公司预订系统。用户可以预订航班。航班由一条或多条航段组成

  ┌─────┐        ┌──────┐      ┌───────┐
  │ Leg ├────────┤Flight├──────┤Booking│
  └─────┘  *   * └──────┘1   * └───────┘
要向用户显示有效航班的列表,系统必须查明航班是否有可用的免费座位。最大可用座位作为字段存储在
Leg
表中。预订的座位存储在
Booking

航班可能由多条航段组成。例如,可能有3个航段A->B->C,以及两个用户可以预订的航班:

  • A->B:从A到B的航班
  • A->B->C:从A经B到C的航班
  • 我已经创建了一个以腿为单位的分组,这给了我每个腿的预定座位数。但是我需要生成一个航班列表,每个航段的预订乘客数量最高。在上面的例子中:如果乘客预订了2号航班,1号航班的可用座位可能会减少,因为他们都“共享”了第一段航程

    select l.id as Leg, sum(b.number_passengers) as BookedSeats
    FROM flight f
         JOIN flight_legs fl on f.id = fl.flight_id
         JOIN leg l on fl.legs_id = l.id
         JOIN booking b on f.id = b.flight_id
    GROUP BY l.id;
    
    如何创建有可用座位的航班列表

    例子 模式 腿 身份证件 有座位吗 1. 2. 2. 2.
    以下查询实现所需的输出。如果前一段已满,我使用
    Lag
    功能转到前一行

    SELECT Leg,
       case
         when Free_Seats = 0 then 0 
            else (case when PrevLeg = 0 then 0 else Free_Seats end) end as Free_Seats
    
    FROM (SELECT Leg,Free_Seats,LAG(Free_Seats,1) OVER(ORDER BY Leg) PrevLeg
      FROM (SELECT l.id AS Leg,l.seats_available,b.number_passengers,fl.flight_id,
                 (max(l.seats_available) OVER(PARTITION BY fl.flight_id) - sum(b.number_passengers) OVER(PARTITION BY fl.flight_id)) AS Free_Seats,
                 ROW_NUMBER() OVER(PARTITION BY fl.flight_id ORDER BY fl.flight_id) AS seq
             FROM flight f
              JOIN flight_legs fl ON f.id = fl.flight_id
              JOIN leg l ON fl.legs_id = l.id
              JOIN booking b ON f.id = b.flight_id) T
     WHERE t.seq=1) T
    

    如果需要,请输入所需的输出和样本数据possible@LucasEthen添加了dbfiddle示例的解释。谢谢。这给了我每条腿的免费座位。但我需要每个航班的免费座位。我理解,但您期望的输出是错误的,因为flight_id=1有两个航段记录,总共有四个座位,其中还有两个座位。然后我不清楚我的示例:第一航段有1名预订1的乘客(预订的航班1)和1名预订2的乘客(预订的航班2)。因此,航班1应提供0个免费座位,因为第一航段有两人预订(但不同的航班)。2号航班也应提供0个免费座位,因为第一航段已满,但第二航段将提供一个免费座位。更新了预期的输出。我实现了您的输出。我希望这是根据你的要求。不幸的是,这不起作用:不管为leg1设置了多少个座位,免费座位总是0()。而且飞机上也没有我的免费座位。相反,它提供免费的腿部座位。