Sql 展平BigQuery表中多个大小相同的数组列

Sql 展平BigQuery表中多个大小相同的数组列,sql,google-bigquery,flatten,unnest,Sql,Google Bigquery,Flatten,Unnest,我有一个包含多个列的表,其中一些列是相同长度的数组。我想取消对它们的测试,以获得一个结果,其中包含来自单独行中数组的值 所以有这样一张桌子: 我想谈谈: 以下是其中一个数组列的工作方式: WITH data AS ( SELECT 1001 as id, ['a', 'b', 'c'] as array_1, [1, 2, 3] as array_2 UNION ALL SELECT 1002 as id, ['d', 'e', 'f', 'g'] as array_1, [4,

我有一个包含多个列的表,其中一些列是相同长度的数组。我想取消对它们的测试,以获得一个结果,其中包含来自单独行中数组的值

所以有这样一张桌子:

我想谈谈:

以下是其中一个数组列的工作方式:

WITH data AS
(
  SELECT 1001 as id, ['a', 'b', 'c'] as array_1, [1, 2, 3] as array_2
  UNION ALL
  SELECT 1002 as id, ['d', 'e', 'f', 'g'] as array_1, [4, 5, 6, 7] as array_2
  UNION ALL
  SELECT 1003 as id, ['h', 'i'] as array_1, [8, 9] as array_2
)
SELECT id, a1
FROM data,
UNNEST(array_1) as a1

是否有一些优雅的方法可以同时取消两个数组的测试?我希望避免分别取消对每个列的测试,然后将所有内容连接在一起。

您可以使用带有偏移量的
连接:

WITH data AS
(
  SELECT 1001 as id, ['a', 'b', 'c'] as array_1, [1, 2, 3] as array_2
  UNION ALL
  SELECT 1002 as id, ['d', 'e', 'f', 'g'] as array_1, [4, 5, 6, 7] as array_2
  UNION ALL
  SELECT 1003 as id, ['h', 'i'] as array_1, [8, 9] as array_2
)
SELECT id, a1, a2
FROM data cross join
     UNNEST(array_1) as a1 with offset n1 JOIN
     UNNEST(array_2) as a2 with offset n2 
     on n1 = n2

下面是BigQuery标准SQL

#standardSQL
SELECT id, a1, a2
FROM data, UNNEST(array_1) AS a1 WITH OFFSET 
JOIN UNNEST(array_2) AS a2 WITH OFFSET
USING(OFFSET)

因此,我自己做了一些关于在SQL中取消测试的研究,并提出了以下解决方案:

WITH data AS
(
  SELECT 1001 as id, ['a', 'b', 'c'] as array_1, [1, 2, 3] as array_2
  UNION ALL
  SELECT 1002 as id, ['d', 'e', 'f', 'g'] as array_1, [4, 5, 6, 7] as array_2
  UNION ALL
  SELECT 1003 as id, ['h', 'i'] as array_1, [8, 9] as array_2
)
SELECT id, a1, array_2[OFFSET(off)] AS a2
FROM data
CROSS JOIN UNNEST(array_1) AS a1 WITH OFFSET off

优点是它不需要卸载所有阵列,只需卸载一个。

谢谢,这解决了我遇到的类似问题。请您指向文档以了解有关偏移量关键字的更多信息,好吗?我似乎不明白在这种情况下它是如何工作的。