代码之家  ›  专栏  ›  技术社区  ›  Thomas

使用union时如何对数组的输出进行排序

  •  1
  • Thomas  · 技术社区  · 4 年前

    我有这样一个问题:

    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]错误:FROM中的子查询必须有别名提示:例如,FROM(选择…)[作为]福。职位:15

    1 回复  |  直到 4 年前
        1
  •  0
  •   Bohemian    4 年前

    为每个子查询添加一列进行排序,但不要将其包含在输出中:

    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,只有 第一 子查询的列名是相关的——整个联合使用第一个子查询中的列名——所以不要麻烦为其他子查询提供别名。