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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 09:42:34