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

如何用BigQuery标准SQL查询REPEATED类型字段的重复记录?

在BigQuery标准SQL中提取REPEATED RECORD类型的重复项

针对你描述的EMP表结构(包含嵌套的REPEATED类型Salary字段),要提取每个重复的薪资记录,BigQuery的UNNEST()函数是最直接的解决方案,我给你具体的SQL写法和解释:

核心SQL写法

SELECT
  Empno,
  Name,
  Age,
  salary_entry.Month,
  salary_entry.Amt
FROM
  `your-project.your-dataset.EMP`, -- 替换成你的实际项目、数据集和表名
  UNNEST(Salary) AS salary_entry

关键细节解释

  • UNNEST(Salary):这个函数会把表中REPEATED类型的Salary数组拆分成独立的行,每个Salary子记录(包含Month和Amt)对应一行数据
  • 主表和UNNEST()结果之间的逗号,是BigQuery中隐式交叉连接的写法,和显式写CROSS JOIN UNNEST(Salary)完全等价
  • 给UNNEST后的子记录起别名salary_entry,方便引用它的子字段Month和Amt

执行结果示例

用你提供的测试数据运行这段SQL后,会得到如下扁平化的结果:

EmpnoNameAgeMonthAmt
1Alex25Jan2000
1Alex25Feb3000
1Alex25Mar3500
2Teresa26Jan1000
2Teresa26Feb2000
2Teresa26Mar3000

进阶场景:保留原始数组结构

如果业务需要同时保留原始的Salary数组和展开后的明细行,可以使用带WITH OFFSET的左连接,还能跟踪每个子项在原数组中的位置:

SELECT
  Empno,
  Name,
  Age,
  Salary, -- 保留原始的REPEATED RECORD字段
  salary_entry.Month,
  salary_entry.Amt,
  entry_offset -- 子项在原数组中的索引(从0开始计数)
FROM
  `your-project.your-dataset.EMP`
LEFT JOIN UNNEST(Salary) AS salary_entry WITH OFFSET AS entry_offset
ON TRUE

这种写法适合需要对比原始数组和展开明细,或者后续需要基于索引做进一步处理的场景。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:57:48