我需要将array1array2组合在一起,但它们在相应位置的元素应该组合在一起.array1array2的长度很高,并手动将它们与

ARRAY_CONSTRUCT(
      ARRAY_CONSTRUCT(array1[1], array2[1]),
      ARRAY_CONSTRUCT(array1[2], array2[2]),
      ARRAY_CONSTRUCT(array1[3], array2[3])
      ...
    )

是个糟糕的解决方案.对如何实现这一目标有什么建议吗?

样本数据:

CREATE OR REPLACE TEMPORARY TABLE sample_table AS (
  SELECT
    TO_DATE('2022-01-01', 'YYYY-MM-DD') AS date_column,
    ARRAY_CONSTRUCT(1, 2, 3) AS array1,
    ARRAY_CONSTRUCT(10, 20, 30) AS array2
  UNION
  SELECT
    TO_DATE('2022-01-02', 'YYYY-MM-DD') AS date_column,
    ARRAY_CONSTRUCT(4, 5) AS array1,
    ARRAY_CONSTRUCT(30, 40) AS array2
  UNION
  SELECT
    TO_DATE('2022-01-03', 'YYYY-MM-DD') AS date_column,
    ARRAY_CONSTRUCT(6, 7, 8, 9) AS array1,
    ARRAY_CONSTRUCT(60, 70, 80, 90) AS array2
);

enter image description here

预期结果:

CREATE OR REPLACE TEMPORARY TABLE sample_table_2 AS (
  SELECT
    TO_DATE('2022-01-01', 'YYYY-MM-DD') AS date_column,
    ARRAY_CONSTRUCT(1, 2, 3) AS array1,
    ARRAY_CONSTRUCT(10, 20, 30) AS array2,
    ARRAY_CONSTRUCT([1,10],[2,20],[3,30]) AS array3
  UNION
  SELECT
    TO_DATE('2022-01-02', 'YYYY-MM-DD') AS date_column,
    ARRAY_CONSTRUCT(4, 5) AS array1,
    ARRAY_CONSTRUCT(30, 40) AS array2,
    ARRAY_CONSTRUCT([4,30],[5,40]) AS array3
  UNION
  SELECT
    TO_DATE('2022-01-03', 'YYYY-MM-DD') AS date_column,
    ARRAY_CONSTRUCT(6, 7, 8, 9) AS array1,
    ARRAY_CONSTRUCT(60, 70, 80, 90) AS array2,
    ARRAY_CONSTRUCT([6,60],[7,70],[8,80],[9,90]) AS array3
)

enter image description here

推荐答案

如果两个数组的长度相同,则可以使用FLATTEN构建子数组:

with data as (
  SELECT
    TO_DATE('2022-01-01', 'YYYY-MM-DD') AS date_column,
    ARRAY_CONSTRUCT(1, 2, 3) AS array1,
    ARRAY_CONSTRUCT(10, 20, 30) AS array2
  UNION
  SELECT
    TO_DATE('2022-01-02', 'YYYY-MM-DD') AS date_column,
    ARRAY_CONSTRUCT(4, 5) AS array1,
    ARRAY_CONSTRUCT(30, 40) AS array2
  UNION
  SELECT
    TO_DATE('2022-01-03', 'YYYY-MM-DD') AS date_column,
    ARRAY_CONSTRUCT(6, 7, 8, 9) AS array1,
    ARRAY_CONSTRUCT(60, 70, 80, 90) AS array2
)
select d.*
    ,f.seq
    ,array_construct(d.array1[f.index], d.array2[f.index]) as sub_array
from data as d,
    table(flatten(input=>d.array1)) as f

enter image description here

然后aggregate个人重新聚集在一起,就像:

select d.*
    ,array_agg(array_construct(d.array1[f.index], d.array2[f.index])) within group (order by f.index) as array3
from data as d,
    table(flatten(input=>d.array1)) as f
group by f.seq,1,2,3;

给出预期的结果:

enter image description here

Sql相关问答推荐

跨多列的PostgreSQL非不同对

GROUP BY与多个嵌套查询T—SQL

如何在case语句中使用条件来计算成对变量

如何连接第二个表并将其内容输入到第一个表的单个字段中?

过go 四周未填充的数据,即W50,51,52-SQL

Pgsql-返回包含多行数据的行

无法将发票与产品价格相关联

如何找到一个组合的两个列,这是不是在其他表在ORACLE SQL?

我如何才能在付款人单列中拉出只有9个付款人单的人?

每个学校 Select N个最新的行,但跳过同一学生的重复行

从给定数据中查找下一个工作日期

根据具有特定值的 ID 创建自定义组

Grafana SQL 模板变量(值、文本)

对于小数据集,EF / SQL 语句花费的时间太长

如何在 SQL Server 中解决这个复杂的窗口查询?

我可以在 T-SQL (SQL Server) 的函数内使用 OPTION 子句吗?

计算 BigQuery 中列的中值差 - 分析函数不能作为聚合函数的参数

获取所有用户的第一次和最后一次发货以及到达日期

在 MS Access VBA 中,如何测量显示查询的时间?

聚合 Athena 中的列