如何用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后,会得到如下扁平化的结果:
| Empno | Name | Age | Month | Amt |
|---|---|---|---|---|
| 1 | Alex | 25 | Jan | 2000 |
| 1 | Alex | 25 | Feb | 3000 |
| 1 | Alex | 25 | Mar | 3500 |
| 2 | Teresa | 26 | Jan | 1000 |
| 2 | Teresa | 26 | Feb | 2000 |
| 2 | Teresa | 26 | Mar | 3000 |
进阶场景:保留原始数组结构
如果业务需要同时保留原始的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
相关产品推荐
相关产品推荐

