Как упорядочить вывод массивов при использовании union

У меня есть такой запрос:

SELECT array_agg(candles) as candles FROM ( SELECT * FROM ... ) AS candles
UNION ALL
SELECT array_agg(trades) as trades FROM ( SELECT * FROM ... ) AS trades
UNION ALL
SELECT ...

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

Как я могу получить строки в предсказуемом порядке?


Редактировать:

обновил запрос на основе ответа, но получил ошибку:

SELECT a FROM
(
    SELECT 1 as o, array_agg(candles) as a
    FROM (
        SELECT ts, open, high, low, close, midpoint, volume
        FROM exchange.binance.candles
        WHERE instrument = 'BTCUSDT' AND ts >= '2022-04-01 00:00:00' AND ts < '2022-04-01 01:00:00'
        ORDER BY ts) AS candles
    UNION ALL
    SELECT 2 as o, array_agg(trades)
    FROM (
        SELECT ts, price, quantity, direction
        FROM exchange.binance.trades
        WHERE instrument = 'BTCUSDT' AND ts >= '2022-04-01 00:00:00' AND ts < '2022-04-01 01:00:00'
        ORDER BY ts) AS trades
    UNION ALL
    SELECT 3 as o, array_agg(kvwap)
    FROM (
        SELECT ts, price, "interval"
        FROM exchange.binance.kvwap
        WHERE instrument = 'BTCUSDT' AND "interval" IN ('M5', 'H1', 'H4') AND ts >= '2022-04-01 00:00:00' AND ts < '2022-04-01 01:00:00'
        ORDER BY ts) AS kvwap
)
ORDER BY o;

ошибка:

[42601] ERROR: subquery in FROM must have an alias Hint: For example, FROM (SELECT ...) [AS] foo. Position: 15

Вау! Вы изменили вопрос. Пожалуйста, отмените редактирование и задайте новый вопрос о названии столбца.

Bohemian 10.04.2022 01:47

@Bohemian, подойдет; вы были быстры с ответом: D спасибо!

Thomas 10.04.2022 01:50
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
Четыре эффективных способа центрирования блочных элементов в CSS
Четыре эффективных способа центрирования блочных элементов в CSS
У каждого из нас бывали случаи, когда нам нужно отцентрировать блочный элемент, но мы не знаем, как это сделать. Даже если мы реализуем какой-то...
1
2
15
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

SELECT a FROM (
  SELECT 1 as o, array_agg(candles) as a FROM ( SELECT * FROM ... ) c group by 1
  UNION ALL
  SELECT 2, array_agg(trades) FROM ( SELECT * FROM ... ) t group by 1
  UNION ALL
  SELECT ...
) x
ORDER BY o

Обратите внимание, что с UNION релевантны только имена столбцов подзапроса первый — весь союз использует имена столбцов из первого подзапроса, поэтому не беспокойтесь о предоставлении псевдонимов для других.

Я получаю сообщение об ошибке, я отредактировал вопрос, чтобы показать его

Thomas 10.04.2022 01:57

О@Томас, ой. См. редактирование.

Bohemian 10.04.2022 02:02

это работает, спасибо!; что делает последний персонаж? (я совсем новичок в SQL)

Thomas 10.04.2022 02:03

Этот «x» представляет собой таблицу псевдоним для самого внешнего подзапроса, который, хотя и бесполезен, тем не менее требуется для Postgres (и других БД). Вы можете использовать его из примера, если вы присоединяетесь к подзапросам и вам нужно различать столбцы с одинаковыми именами, чтобы однозначно идентифицировать столбцы, используя их полное имя alias_name.column_name.

Bohemian 10.04.2022 02:05

Другие вопросы по теме