在 BigQuery 中取消嵌套结构

Unnesting structs in BigQuery

在 BigQuery 中展平两个数组结构的正确方法是什么?我有一个如图所示的数据集(struct.destination 和 struct.visitors 数组是有序的 - 即访问者计数专门对应于同一行中的目的地):

我想重新组织数据,以便获得每个独特的出发地和目的地组合的总访客数。理想情况下,最终结果将如下所示:

我尝试连续两次使用 UNNEST - 一次在 struct.destination 上,然后在 struct.visitors 上,但这会产生错误的结果(每个目的地都映射到访问者计数数组中的每个值当它应该只映射到同一行中的值时):

SELECT
  origin,
  unnested_destination,
  unnested_visitors
FROM
  dataset.table,
  UNNEST(struct.destination) AS unnested_destination,
  UNNEST(struct.visitors) AS unnested_visitors

你有一个重复的结构。所以,我想你想要:

SELECT origin,
       s.destination,
       s.visitors
FROM dataset.table t CROSS JOIN
     UNNEST(t.struct) s;

编辑:

我明白了,你有一个包含两个数组的结构。你可以这样做:

SELECT origin, d.destination, v.visitors
FROM dataset.table t CROSS JOIN
     UNNEST(struct.destination) s WITH OFFSET nd LEFT JOIN
     UNNEST(struct.visitors) v WITH OFFSET nv
     ON nd = nv

由于没有可测试的基础数据而难以测试,因此我使用您的数据集创建了自己的查询。据我所知,destination|visitors 不是 ARRAY 格式,而是 STRUCT 格式,因此您不需要 UNNEST 它。另请查看此线程 :)

SELECT
  origin,
  COUNT(struct.destination),
  COUNT(struct.visitors)
FROM dataset.table
GROUP BY 1