преобразование списка оракула в postgres

Я пытаюсь преобразовать некоторые запросы Oracle в Postgres и наткнулся на listagg.

Код Oracle

select max(eta) eta, mso_id, listagg(carrier_name, ',') 
within group (order by eta) as carrier 
from tb_flight_schedule group by mso_id;

Я узнал, что эквивалентом listagg в Postgres является string_agg, и заменил listagg на string_agg. Однако я столкнулся с ошибкой (ОШИБКА: функция string_agg (переменный символ, неизвестно, дата) не существует). Я что-то упустил в запросе? Запрос Postgres ниже:

select max(eta) eta, mso_id, string_agg(carrier_name, ',') 
WITHIN GROUP (ORDER BY eta) as carrier 
from tb_flight_schedule group by mso_id;

person user99    schedule 26.05.2018    source источник


Ответы (1)


В Postgres предложение within group используется только для агрегатных функций с упорядоченным набором, то есть функций, которые требуют предложения order by (например, функции процентиля). Необязательное предложение order by, такое как string_agg, входит в аргументы функции:

SELECT   MAX(eta) eta, mso_id, STRING_AGG(carrier_name, ',' ORDER BY eta) AS carrier 
FROM     tb_flight_schedule
GROUP BY mso_id;
person Mureinik    schedule 26.05.2018
comment
а ну понятно. Большое спасибо! :) - person user99; 26.05.2018