oracle: получить указанную дату c с условием - PullRequest
0 голосов
/ 19 февраля 2020

У меня есть эта таблица с информацией о каждом движении рейса и информацией о месте отправления и назначения билета на самолет на этот рейс.

   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 запросах, а затем присоединиться к ним с объединением, но я считаю его неэффективным .

THX!

1 Ответ

0 голосов
/ 19 февраля 2020

Сначала группируйте данные по бронированию и рейсу, затем на следующем шаге только по бронированию. Таким образом, вы можете найти все необходимые значения:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...