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

如何在BigQuery中仅删除特定ReportingDate的重复数据?

解决BigQuery中指定日期重复数据的删除问题

你的原SQL语句问题在于:子查询仅判断2023-09-15这个日期存在重复记录,但没有区分具体哪些行是重复项,导致所有该日期的记录都会被匹配到,最终会删除该日期的全部数据。

下面是两种正确的处理方式:

方式一:直接删除重复行(DML操作)

通过窗口函数ROW_NUMBER()标记重复组内的行,仅保留每组的第一行,删除其他重复行:

DELETE FROM my_table
WHERE STRUCT(ReportingDate, Balance, Currency, Service) IN (
  SELECT STRUCT(ReportingDate, Balance, Currency, Service)
  FROM (
    SELECT 
      ReportingDate, Balance, Currency, Service,
      -- 按所有字段分组,给每组内的行编号
      ROW_NUMBER() OVER (PARTITION BY ReportingDate, Balance, Currency, Service ORDER BY ReportingDate) AS row_num
    FROM my_table
    WHERE ReportingDate = '2023-09-15'
  )
  WHERE row_num > 1
);
  • PARTITION BY后的字段是判断重复的依据(这里因为是完全重复的记录,所以包含所有字段)
  • row_num > 1表示只删除每组中除第一行外的重复项

方式二:创建新表替换原表(适合大表场景)

如果你的表数据量较大,BigQuery的DML删除操作成本较高,可以用替换表的方式保留唯一记录:

CREATE OR REPLACE TABLE my_table
AS
SELECT * FROM (
  SELECT 
    *,
    ROW_NUMBER() OVER (PARTITION BY ReportingDate, Balance, Currency, Service ORDER BY ReportingDate) AS row_num
  FROM my_table
)
-- 保留非目标日期的所有数据,以及目标日期每组的第一行
WHERE row_num = 1 OR ReportingDate != '2023-09-15';

如果全表只有2023-09-15存在重复,也可以用更简洁的写法:

CREATE OR REPLACE TABLE my_table
AS
SELECT DISTINCT * FROM my_table;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 16:22:19