【问题标题】:Bus seat calculation dynamic algorithm with variation in stops含站点变化的公交车座位计算动态算法
【发布时间】:2025-12-07 03:15:01
【问题描述】:

鉴于下面的数据库结果,

  • BusStopNumber 中的空值表示摩加迪沙的 Origin
  • BusStopNumber2 中的空值表示在这种情况下内罗毕的目的地

如果巴士上共有 10 个座位。

当乘客想要从摩加迪沙前往哈尔格萨(目的地之前的最后一站)并且我们从初始点到最终点预订了 2 个座位时,计算剩余座位数的最佳方法是什么?同样,我想从 SeatsCount 列计算可用座位,该列表示所有路线的预订座位数。

【问题讨论】:

    标签: c# .net sql-server logic


    【解决方案1】:
    declare @booking table
    (
        id int identity,
        busid int,
        scheduleid int,
        stopnumber smallint,
        stopnumber2 smallint,
        seatscount smallint
    );
    
    insert into @booking(busid, scheduleid, stopnumber, stopnumber2, seatscount)
    values 
    (1, 6, null, null, 2),
    (1, 6, null, 1, 2),
    (1, 6, null, 2, 1),
    (1, 6, null, 3, 2),
    (1, 6, 1, null, 2),
    (1, 6, 1, 2, 1),
    (1, 6, 1, 3, 1),
    (1, 6, 2, null, 1),
    (1, 6, 2, 3, 1),
    (1, 6, 3, null, 2);
    
    select * from @booking;
    
    
    select *, 
    --total number of passengers that got on the bus at previous&current stops
    (select isnull(sum(e.seatscount), 0) from @booking as e where e.busid = b.busid and e.scheduleid = b.scheduleid and isnull(e.stopnumber, 0) <= isnull(b.stopnumber, 0))
    -
    --total number of passengers that got off the bus at previous&current stops
    (select isnull(sum(d.seatscount), 0) from @booking as d where d.busid = b.busid and d.scheduleid = b.scheduleid and d.stopnumber2 <= b.stopnumber)
    as PassengersOnBusAtStopNumber
    from @booking as b;
    

    【讨论】:

    • 这似乎很天才,但有一个问题如下ibb.co/9v6BxcZ,正如您在第 2 行看到的那样,特定站点上只有 2 个座位,整个路线的休息应该是 2,但所有站点的目的地都是占用
    • PassengersOnBusAtStopNumber 是巴士出发前的乘客人数(巴士离开 stopnumber 前)。您可以遵循类似的逻辑(数学略有不同)并在公共汽车到达 stopnumber2 之前计算乘客人数。所有这一切,假设座位数是从 stopnumber-->stopnumber2 的路线预订(和/或占用)的座位数。对于您的第一条评论: NULL-NULL 的第 1 行:2 个座位数(巴士将在整条路线上至少有 2 个被占用的座位)。第 2 行:2 个座位数为 NULL - 1。PassengersOnBusAtStopNumber[NULL] = 4
    • Row2 {2 seatcount for NULL - 1}也表示这两个人在stopnumber = 1 下车。从Row3 开始,seatcount = 0 --> 没有预订--> 没有乘客上车公共汽车,因此PassengersOnBusAtStopNumber[1],[2],[3] = 2(最初出发时有4人 - 2人在stopnumber1下车),我再次假设座位数是公共汽车上的人数或上车,seatcount = 特定路线的预订座位(从 stopnumber 到 stopnumber2)
    • 嘿,我知道你的现象在逻辑上是准确正确的,谢谢你的时间和完美的解决方案。
    • 不客气。通过计算每个停靠站号(每次出发)的公交车上的乘客,您可以计算出特定路线的可用座位数:可以说,您所有的信息都是预先预订的(公交车还没有离开摩加迪沙站)。一个人想要从 Bossaso(stop:1) 到 Nairobi (stopnumber2 = null),路线:@1 到 @NULL 的可用座位数是:'BusSeats(constant:10) - MAX(PassengersOnBusAtStopNumber) FROM (. .query..) as av where av.busid=1 and av.scheduleid=1 and isnull(av.stopnumber, 0) >= @1 and (av.stopnumber