Postgres 表转二维数组

Flo*_*ris 2 arrays postgresql

我想将具有三列的表转换为类型的二维数组integer[][]。有两列指示数组的两个维度中的每一维(xy示例中),一integer列指示值。

数据中考虑了 x 和 y 的所有可能组合,但如果可能的解决方案可以替代和NULL的缺失组合,那就太好了。xy

该表看起来像这样:

DROP TABLE IF EXISTS t1;

CREATE TABLE t1 (
    x VARCHAR,
    y VARCHAR,
    val INT
);

INSERT INTO t1 (x, y, val)
VALUES   ('A', 'A', 1),
         ('A', 'B', 2),
         ('A', 'C', 3),
         ('B', 'A', 4),
         ('B', 'B', 5),
         ('B', 'C', 6),
         ('C', 'A', 7),
         ('C', 'B', 8),
         ('C', 'C', 9);

SELECT * FROM t1
Run Code Online (Sandbox Code Playgroud)

如何编写此查询以返回二维数组?

例如。此特定查询的结果应为以下数组:

SELECT '{{1,2,3},{4,5,6},{7,8,9}}'::integer[][]
Run Code Online (Sandbox Code Playgroud)

sti*_*bit 5

一种可能性是首先进行 group byx并使用array_agg()来获取内部数组。然后再次聚合,array_agg()将内部数组放入一个外部数组中。

SELECT array_agg(a ORDER BY x)
       FROM (SELECT x,
                    array_agg(val ORDER BY y) a
                    FROM t1
                    GROUP BY x) t;
Run Code Online (Sandbox Code Playgroud)