【问题标题】:oracle: get a specific date with a conditionoracle:获取带有条件的特定日期
【发布时间】:2020-02-20 01:25:03
【问题描述】:

我有这张表,其中包含每个航班的移动信息以及该航班机票的出发地和目的地信息。

   RESERVATION  FLIGHT ORIG  DEST   DT                PASSENGER_CODE PASSEN_ORI  PASSEN_DEST
    --------------------------------------------------------------------------------------------
    111         LA111   MSP   LAX   01/01/2020 21:30   ABC            LAX          MIA
    111         LA111   LAX   JFK   01/01/2020 23:00   ABC            LAX          MIA
    111         LA111   JFK   MIA   02/01/2020 01:00   ABC            LAX          MIA  
    111         LA111   MIA   ATL   02/01/2020 02:00   ABC            LAX          MIA
    111         LA112   MIA   PHX   02/01/2020 03:00   ABC            MIA          ARG
    111         LA112   PHX   SCL   02/01/2020 18:45   ABC            MIA          ARG
    111         LA112   SCL   ARG   02/01/2020 23:00   ABC            MIA          ARG
    111         LA112   ARG   LIM   03/01/2020 03:00   ABC            MIA          ARG

我需要获取航班信息,但只需要与机票相关的人员提供的出发和到达日期时间

   RESERVATION  FLIGHTS   FL_INI_ROU  FL_END_ROU PASSEN_ROUTE PASSEN_DEPARTURE_DT PASSEN_ARRIVAL_DT
    ------------------------------------------------------------------------------------------------
    111       LA111-LA112   MSP-ATL   MIA-LIM  LAX-ARG        01/01/2020 23:00    02/01/2020 23:00 

我尝试在 2 个查询中获取出发和到达日期,然后将它们与 union 结合,但我发现它效率低。

谢谢!

【问题讨论】:

  • 能否请您编辑问题并显示您的查询。

标签: oracle


【解决方案1】:

首先按预订和航班对数据进行分组,然后在下一步中仅按预订进行分组。这样您就可以找到所有需要的值:

select reservation, listagg(flight, '-') within group (order by mnd) flights,
       min(orig) keep (dense_rank first order by r1) || ' - ' 
         || min(dest) keep (dense_rank first order by r1) as ini_rt,
       min(orig) keep (dense_rank first order by r2) || ' - ' 
         || min(dest) keep (dense_rank first order by r2) as end_rt,
       min(o1) keep (dense_rank first order by r1) || ' - ' 
         || min(o2) keep (dense_rank first order by r2) as route,
       min(mnd) dep_dt, max(mxd) arr_dt
  from (
    select reservation, flight, 
           min(orig) keep (dense_rank first order by dt) orig, 
           min(dest) keep (dense_rank last order by dt) dest,
           row_number() over (order by min(dt)) r1, 
           row_number() over (order by min(dt) desc) r2, 
           min(passen_ori) keep (dense_rank first order by dt) o1,
           min(passen_dest) keep (dense_rank last order by dt) o2,
           min(dt) mnd, max(dt) mxd
      from flights
      group by reservation, flight )
  group by reservation

dbfiddle

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-09-27
    • 2023-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多