Резюме
Используйте Аналитические функции и listagg
, чтобы выполнить работу.
Detail
Создать два списка значений code_id
и code
. Сопоставьте значения code_id
для тех же кодов аэропортов (пассажиры вылетают из того же аэропорта, в который они только что прибыли). Использование lag
и lead
для получения значений из других строк. NULL
s будет существовать в течение code_id
в начале и в конце маршрута. По умолчанию первый NULL
равен 0
, а последний NULL
равен предыдущему code_id
плюс 1. Будет создан список кодов с соответствующим индексом. Объедините списки вместе и удалите дубликаты, используя union
. Наконец, используйте listagg
без разделителя для объединения строк в строковое значение.
with codes as
(
select
nvl(lag(t1.id) over (order by t1.id),0) as code_id,
t1.depart_airport_code as code
from table1 t1
union
select
nvl(lead(t1.id) over (order by t1.id)-1,lag(t1.id) over (order by t1.id)+1) as code_id,
t1.arrive_airport_code as code
from table1 t1
)
select
listagg(c.code,'') WITHIN GROUP (ORDER BY c.code_id) as result
from codes c;
Примечание: Это решение зависит от наличия целого поля id
. В противном случае у аналитических функций не будет столбца для сортировки. Если id
не существует, вам нужно будет создать его на основе другого столбца, такого как отметка времени или другой идентификатор, который гарантирует, что строки расположены в правильном порядке.
Используйте row_number() over (order by myorderedidentifier) as id
в подзапросе или представлении, чтобы достичь этого. Не использовать rownum
. Это может дать вам непредсказуемые результаты. Без условия ORDER BY
нет гарантии, что один и тот же запрос будет возвращать одинаковые результаты каждый раз.
выход
| RESULT |
|-----------------|
| SVGFRAMXPOSLSVG |