У меня есть такой запрос:
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, подойдет; вы были быстры с ответом: D спасибо!
Добавьте столбец для упорядочения в каждый подзапрос, но не включайте его в вывод:
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 релевантны только имена столбцов подзапроса первый — весь союз использует имена столбцов из первого подзапроса, поэтому не беспокойтесь о предоставлении псевдонимов для других.
Я получаю сообщение об ошибке, я отредактировал вопрос, чтобы показать его
О@Томас, ой. См. редактирование.
это работает, спасибо!; что делает последний персонаж? (я совсем новичок в SQL)
Этот «x» представляет собой таблицу псевдоним для самого внешнего подзапроса, который, хотя и бесполезен, тем не менее требуется для Postgres (и других БД). Вы можете использовать его из примера, если вы присоединяетесь к подзапросам и вам нужно различать столбцы с одинаковыми именами, чтобы однозначно идентифицировать столбцы, используя их полное имя alias_name.column_name
.
Вау! Вы изменили вопрос. Пожалуйста, отмените редактирование и задайте новый вопрос о названии столбца.