【问题标题】:sql to find all passengers boarding a bussql查找所有上车的乘客
【发布时间】:2021-10-23 09:28:14
【问题描述】:
with buses as (
    select 10 as id,'warsaw' as origin, 'berlin' as destination, '10:55' as time
    union all
    select 20 as id,'berlin' as origin, 'paris' as destination, '06:20' as time
    union all
    select 21 as id,'berlin' as origin, 'paris' as destination, '14:00' as time
    union all
    select 22 as id,'berlin' as origin, 'paris' as destination, '21:40' as time
    union all
    select 30 as id,'paris' as origin, 'madrid' as destination, '13:30' as time
    ),
  passengers as (
    select 1 as id,'paris' as origin, 'madrid'  as destination, '13:30' as time
    union all
    select 2 as id,'paris' as origin, 'madrid'  as destination, '13:31' as time
    union all
    select 10 as id,'warsaw' as origin, 'paris' as destination, '10:00' as time
    union all
    select 11 as id,'warsaw' as origin, 'berlin' as destination, '22:31' as time
    union all
    select 40 as id,'berlin' as origin, 'paris' as destination, '06:15' as time
    union all
    select 41 as id,'berlin' as origin, 'paris' as destination, '06:50' as time
    union all
    select 42 as id,'berlin' as origin, 'paris' as destination, '07:12' as time
    union all
    select 43 as id,'berlin' as origin, 'paris' as destination, '12:03' as time
    union all
    select 44 as id,'berlin' as origin, 'paris' as destination, '20:00' as time
  )
     ,
c as (select a.id as bus_id,a.origin as  bus_origin, a.destination as bus_destination ,a.time as bus_time,
             b.id as passenger_id, b.origin as passenger_origin, b.destination as passenger_destination, b.time as passenger_time
             from
buses a
join passengers b
on a.origin=b.origin
and a.destination=b.destination
-- and to_timestamp(b.time,'HH24:MI')<=to_timestamp(a.time,'HH24:MI')
-- and to_timestamp(b.time,'HH24:MI')<=to_timestamp('23:59','HH24:MI')
) select * from c

给定上面的输入表,其中对于乘客来说它描述了乘客到达公共汽车站的时间,对于公共汽车来说它描述了公共汽车从公共汽车站离开的时间,我需要找到登上公共汽车的乘客数量.需要得到以下输出:

bus_id - Num_passengers
10 - 0
20- 1
21 - 3
22 - 1
30 - 1

条件:

  • 乘客总是登上下一班车。
  • 可以假设任何在 23:59 之后到达的乘客都没有乘坐任何公共汽车。
  • 即使与巴士发车时间同时到达也可以上车

【问题讨论】:

    标签: sql amazon-web-services amazon-redshift


    【解决方案1】:

    考虑这个问题的方法是考虑公共汽车接载乘客的时间跨度。这是由具有相同起点和终点的前一班车决定的。你可以使用lag()找到更早的时间。

    一旦有了时间跨度,查询就会将表连接在一起并聚合:

    select b.id, b.origin, b.destination, b.time, count(p.id) as num_passengers
    from (select b.*, lag(time) over (partition by origin, destination order by time) as prev_time
          from buses b
         ) b left join
         passengers p 
         on p.origin = b.origin and p.destination = b.destination and
            (p.time > b.prev_time or b.prev_time is null) and
            (p.time <= b.time)
    group by b.id, b.origin, b.destination, b.time;
    

    Here 是一个 dbfiddle。

    【讨论】:

      【解决方案2】:

      这不是amazon-redshift,但我相信这个用sql server做的查询你很接近你想要的

      select
        b.id as bus_id,
        sum(case when p.id > 0 then 1 else 0 end) as passengers
      from buses b
        left join passengers p
          on b.origin=p.origin
         and b.destination=p.destination
         and b.time =
           (
             select min(bb.time)
             from buses bb
             where bb.origin = b.origin
               and bb.destination = b.destination
               and bb.time >= p.time
           )
      group by b.id
      

      你可以在这个db<>fiddle上测试

      【讨论】:

        猜你喜欢
        • 2020-07-30
        • 1970-01-01
        • 2016-09-15
        • 2012-01-21
        • 2020-03-29
        • 2016-05-03
        • 2016-01-08
        • 2012-01-11
        • 2021-09-05
        相关资源
        最近更新 更多