You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

BigQuery:如何用原生语句实现重复数组记录转重复记录

当然可以用BigQuery原生SQL搞定这个转换,完全不需要依赖临时UDF,这样就能顺利创建视图啦!

核心思路是利用UNNEST ... WITH OFFSET获取每个数组元素的索引位置,然后把相同索引的字段配对,最后再聚合回数组结构。下面给你针对需求的具体实现:

基础示例(对应你给出的JSON结构)

假设你的表名为your_table,包含一个名为data的RECORD字段(里面有createdBy和fileName两个REPEATED数组),可以用以下SQL:

SELECT
  -- 按索引配对后聚合为Repeated Record
  ARRAY_AGG(STRUCT(
    createdBy,
    fileName
  )) AS paired_records,
  -- 保留原始表的其他字段(如果需要的话)
  other_table_columns
FROM your_table,
-- 展开每个数组并带上索引
UNNEST(data.createdBy) AS createdBy WITH OFFSET AS pos,
UNNEST(data.fileName) AS fileName WITH OFFSET AS pos2
-- 匹配相同索引的元素
WHERE pos = pos2
-- 按原始记录的唯一标识分组,确保每条原始记录对应自己的重组数组
GROUP BY your_table.id, other_table_columns

扩展到多个字段的情况

如果你的实际数据有更多固定键的数组(比如fileSize、uploadTime等),只需要继续添加UNNEST ... WITH OFFSET,并在WHERE条件里保证所有索引一致:

SELECT
  ARRAY_AGG(STRUCT(
    createdBy,
    fileName,
    fileSize,
    uploadTime
  )) AS paired_records
FROM your_table,
UNNEST(data.createdBy) AS createdBy WITH OFFSET AS pos,
UNNEST(data.fileName) AS fileName WITH OFFSET AS pos2,
UNNEST(data.fileSize) AS fileSize WITH OFFSET AS pos3,
UNNEST(data.uploadTime) AS uploadTime WITH OFFSET AS pos4
WHERE pos = pos2 AND pos = pos3 AND pos = pos4
GROUP BY your_table.id

处理特殊情况

  • 数组长度为0:如果所有数组都是空的,ARRAY_AGG会返回空数组,完全符合需求;
  • 数组长度不一致:如果某个数组长度和其他不匹配,WHERE条件会自动过滤掉不对应的索引,最终只保留所有数组都存在对应元素的位置(如果你需要保留不匹配的情况,可以改用FULL JOIN并处理NULL值,但按你的需求应该不需要)。

这个方案完全使用BigQuery原生语法,没有临时函数,可以直接用来创建视图,完美解决你之前遇到的视图限制问题!

内容的提问来源于stack exchange,提问作者Deviling Master

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 23:04:08