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

BigQuery无时间戳时删除col1重复数据保留最后插入行

可行解决方案

你可以利用你当前查询全表默认按插入时间从旧到新返回的特性,先给全表生成全局递增的行号(行号越大代表插入时间越晚),再按col1分组取每组行号最大的记录即可:

1. 查询去重后的结果

WITH all_rows_with_insert_order AS (
  -- 按默认查询顺序生成全局行号,映射插入先后顺序
  SELECT *, ROW_NUMBER() OVER () AS global_insert_rank
  FROM `你的项目ID.你的数据集名.你的表名`
),
ranked_by_col1 AS (
  SELECT *,
    ROW_NUMBER() OVER (PARTITION BY col1 ORDER BY global_insert_rank DESC) AS rn
  FROM all_rows_with_insert_order
)
SELECT col1, col2, col3
FROM ranked_by_col1
WHERE rn = 1;

2. 直接删除原表重复行(覆盖原表)

如果确认结果符合预期,可以直接用以下语句覆盖原表完成重复行删除:

CREATE OR REPLACE TABLE `你的项目ID.你的数据集名.你的表名` AS
WITH all_rows_with_insert_order AS (
  SELECT *, ROW_NUMBER() OVER () AS global_insert_rank
  FROM `你的项目ID.你的数据集名.你的表名`
),
ranked_by_col1 AS (
  SELECT *,
    ROW_NUMBER() OVER (PARTITION BY col1 ORDER BY global_insert_rank DESC) AS rn
  FROM all_rows_with_insert_order
)
SELECT col1, col2, col3
FROM ranked_by_col1
WHERE rn = 1;

注意事项

  • 该方案仅适用于你的表未执行过存储重写操作的场景:如果你对表执行过UPDATE/DELETE/MERGE等DML操作、表优化、分区聚类调整、数据重加载等操作,会改变数据物理存储顺序,导致默认查询顺序与实际插入顺序不一致,此时该方案的结果会出现偏差。
  • 长期使用建议新增默认值为CURRENT_TIMESTAMP()的插入时间字段,可完全规避存储顺序变动带来的问题,后续数据运维的稳定性更高。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 13:06:05