BigQuery按ID实现行转列 聚合多行Area、Amount为多列
BigQuery 固定组数行转列实现方法
直接用分组+条件聚合的方式实现,不需要复杂的PIVOT语法,逻辑简单执行效率高,完全匹配需求:
- 先通过窗口函数给同一ID下的每条Area、Amount记录打上1-4的顺序编号
- 按ID分组,用条件聚合提取对应编号的Area、Amount值,不足4组的字段自动填充NULL
可直接运行的参考代码:
WITH ranked_records AS ( SELECT ID, Area, Amount, -- 如需固定排序规则,可将ORDER BY后内容替换为排序字段,例如 ORDER BY Area ASC ROW_NUMBER() OVER (PARTITION BY ID ORDER BY (SELECT NULL)) AS seq FROM `替换为你的项目.数据集.输入表名` ) SELECT ID, MAX(IF(seq = 1, Area, NULL)) AS Area1, MAX(IF(seq = 1, Amount, NULL)) AS Amount1, MAX(IF(seq = 2, Area, NULL)) AS Area2, MAX(IF(seq = 2, Amount, NULL)) AS Amount2, MAX(IF(seq = 3, Area, NULL)) AS Area3, MAX(IF(seq = 3, Amount, NULL)) AS Amount3, MAX(IF(seq = 4, Area, NULL)) AS Area4, MAX(IF(seq = 4, Amount, NULL)) AS Amount4 FROM ranked_records GROUP BY ID
注意事项
- 代码中
ORDER BY (SELECT NULL)代表不指定额外排序规则,按数据在表中的原始读取顺序生成序号。如果需要按Area值、Amount值固定排列顺序,直接修改ORDER BY后的字段即可。 - 需求中明确单个ID最多关联4组数据,因此代码只处理seq=1到4的记录,超出4条的冗余数据会自动被忽略;不足4条的ID对应缺失位置的字段会自动返回NULL,无需额外写补全逻辑。
- 用给定的样例数据运行上述代码,输出结构和字段值完全匹配给出的预期结果。
内容的提问来源于stack exchange,提问作者user13472171
相关产品推荐
相关产品推荐

