【问题标题】:Transposing 2D Arrays using SQL使用 SQL 转置二维数组
【发布时间】:2020-09-20 17:25:42
【问题描述】:

在 SQL 中考虑这个表定义

CREATE TABLE matrices (
matrix text[][] NOT NULL
);

假设这个表中的每个矩阵都有相同的维度,如何编写查询来转置它们?

例如:

INSERT INTO matrices VALUES
(array[['1','2','3'],
       ['4','5','6']]),
(array[['f','e','d'],
       ['c','b','a']]);

转置后应该是这样的:

 {{1,4},{2,5},{3,6}}
 {{f,c},{e,b},{d,a}}

【问题讨论】:

  • 请只标记相关的RDBMS
  • 为什么这个问题是 MySQL 标记的?
  • 取消嵌套数组,直到单独的元素存储它们的每个维度的位置索引,然后按需要的顺序聚合回来。

标签: sql arrays postgresql select unnest


【解决方案1】:

一个选项使用generate_subscripts()来枚举数组每个维度的索引,然后进行两级聚合。

我们需要一个主键列来正确重建每个数组 - 我假设 id(如果您没有这样的列,我们可以使用 row_number() 在子查询中动态生成它):

select id, array_agg(ar order by j) new_matrix
from (
    select m.id, j, array_agg(matrix[i][j] order by i) ar
    from matrices m
    cross join lateral generate_subscripts(m.matrix, 1) as s1(i)
    cross join lateral generate_subscripts(m.matrix, 2) as s2(j)
    group by m.id, j
) t
group by id

Demo on DB Fiddle

样本数据:

编号 |矩阵 -: | :---------------- 1 | {{1,2,3},{4,5,6}} 2 | {{f,e,d},{c,b,a}}

结果:

编号 |新矩阵 -: | :----------------- 1 | {{1,4},{2,5},{3,6}} 2 | {{f,c},{e,b},{d,a}}

【讨论】:

    猜你喜欢
    • 2010-11-29
    • 1970-01-01
    • 2021-11-21
    • 1970-01-01
    • 2014-06-21
    • 2020-12-23
    • 2014-11-29
    • 2013-06-29
    相关资源
    最近更新 更多