ORACLE: сгруппировать результаты в один столбец - PullRequest
0 голосов
/ 05 февраля 2020

у меня есть эта таблица

FLIGHT  N_flight  ORIGIN  DESTINATION
--------------------------------------------------
1111      1        LAX        MIA
1111      2        MIA        SCL 
1111      3        SCL        ARG
112       1        LAX        ATL
112       2        ATL        JFK
113       1        MIA        SEA
113       2        SEA        PHX
113       3        PHX        MSP
113       4        PHX        LIM

мне нужна группа по рейсу, а в другой группе столбцов все происхождение и пункт назначения полета примерно такие:

FLIGHT  ROUTING 
--------------------------------------------------
1111     LAX - MIA - SCL - ARG
112      LAX - ATL - JFK
113      MIA - SEA - PHX - MSP - LIM

1 Ответ

2 голосов
/ 05 февраля 2020

Вы можете сделать все это в одном агрегированном запросе, например так:

with
  flights (flight, n_flight, origin, destination) as (
    select 1111, 1, 'LAX', 'MIA' from dual union all
    select 1111, 2, 'MIA', 'SCL' from dual union all 
    select 1111, 3, 'SCL', 'ARG' from dual union all
    select  112, 1, 'LAX', 'ATL' from dual union all
    select  112, 2, 'ATL', 'JFK' from dual union all
    select  113, 1, 'MIA', 'SEA' from dual union all
    select  113, 2, 'SEA', 'PHX' from dual union all
    select  113, 3, 'PHX', 'MSP' from dual union all
    select  113, 4, 'MSP', 'LIM' from dual
  )
select flight
     , min(origin)      keep (dense_rank first order by n_flight) as origin
     , min(destination) keep (dense_rank last  order by n_flight) as destination
     , listagg(origin, ' - ') within group (order by n_flight) || ' - ' ||
           min(destination) keep (dense_rank last  order by n_flight) as route
from   flights
group  by flight
;

    FLIGHT ORIGIN DESTINATION ROUTE                         
---------- ------ ----------- ------------------------------
       112 LAX    JFK         LAX - ATL - JFK               
       113 MIA    LIM         MIA - SEA - PHX - MSP - LIM   
      1111 LAX    ARG         LAX - MIA - SCL - ARG 

Обратите внимание, что я изменил последнюю строку в ваших входных данных; Я предполагаю, что отправителем должен быть пункт назначения предыдущего рейса, у вас нет двух отдельных сегментов (3 и 4), исходящих из одного и того же аэропорта.

Предложение WITH смущает многих читателей. Это не часть решения; это только для имитации входов. Удалите его и используйте фактические имена таблиц и столбцов в основном запросе, начиная с select flight...

...