меняется порядок занесения данных в array_agg, требуется занести данные для каждой пары name + dir с сортировкой по length ASC в array_agg с сохранением порядка после сортировки по length ASC?
1) Порядок корректный для одной группы значений, указанной в WHERE,
calc_array (name, dir, array) AS
(
SELECT name, dir, array_agg(sorted.zone) AS array
FROM (
SELECT dd.zone_num AS zone,
dd.dadt4a AS name,
dd.direct AS dir
FROM input_data."XXXXX" AS dd
WHERE dd.zone IS NOT NULL AND dd.name = '1' AND dd.dir = '<'
GROUP BY dd.name, dd.dir, dd.length, dd.zone
ORDER BY dd.length ASC
) AS sorted
GROUP BY name, dir
)
2) Порядок НЕкорректный для каждой группы значений,
calc_array (name, dir, array) AS
(
SELECT name, dir, array_agg(sorted.zone) AS array
FROM (
SELECT dd.zone_num AS zone,
dd.dadt4a AS name,
dd.direct AS dir
FROM input_data."XXXXX" AS dd
WHERE dd.zone IS NOT NULL AND dd.name = '1' AND dd.dir = '<'
GROUP BY dd.name, dd.dir, dd.length, dd.zone
ORDER BY dd.length ASC
) AS sorted
GROUP BY name, dir
)
Я на запросы пристально не смотрел, если что, но в общем — потому, что порядок в подзапросах даже при наличии ORDER BY не гарантируется, как и наличие ORDER BY там не гарантирует, что данные будут агрегироваться в каком-то порядке. Если нужно гарантировать порядок — ORDER BY должен быть указан прямо в агрегатной функции.
как помню в аггрегации такого типа можно сортировку указать
Обсуждают сегодня