如何在BigQuery中不重建表删除同ID的重复行?
解决BigQuery重复行删除问题(保留一行)
针对你的表中ID及所有字段完全一致的重复行,直接按ID删除会移除所有匹配行,用ROW_NUMBER()窗口函数可精准标记重复项,仅删除多余的重复行,无需重建表或修改结构,具体操作如下:
方法1:CTE结合DELETE语句(标准SQL写法)
通过给完全重复的行编序号,删除序号大于1的行:
WITH numbered_rows AS ( SELECT *, -- 按整行内容分组,给每组行编序号 ROW_NUMBER() OVER ( PARTITION BY TO_JSON_STRING(*) ORDER BY ID -- 排序字段可任意,因所有数据完全一致 ) AS row_num FROM `你的项目ID.你的数据集ID.你的表名` -- 替换为实际表路径 ) DELETE FROM `你的项目ID.你的数据集ID.你的表名` WHERE (TO_JSON_STRING(*), row_num) IN ( SELECT TO_JSON_STRING(*), row_num FROM numbered_rows WHERE row_num > 1 );
简化说明:
- 用
TO_JSON_STRING(*)将整行转为JSON字符串,避免手动列出所有字段,确保只有完全一致的行被归为一组 - 操作前可先将
DELETE替换为SELECT *,验证row_num > 1的行是否为待删除的重复项
方法2:MERGE语句(更稳妥的匹配删除方式)
如果担心DELETE逻辑出错,MERGE可通过匹配重复行再执行删除,逻辑更直观:
MERGE INTO `你的项目ID.你的数据集ID.你的表名` target USING ( SELECT *, ROW_NUMBER() OVER ( PARTITION BY TO_JSON_STRING(*) ORDER BY ID ) AS row_num FROM `你的项目ID.你的数据集ID.你的表名` ) source ON TO_JSON_STRING(target) = TO_JSON_STRING(source) AND target.row_num = source.row_num WHEN MATCHED AND source.row_num > 1 THEN DELETE;
注意事项:
- 两种方法均直接在原表操作,无需变更表结构
- 针对百万级数据,BigQuery会自动优化执行效率,无需额外性能担忧
内容的提问来源于stack exchange,提问作者Insecupa
相关产品推荐
相关产品推荐

