【问题标题】:BigQuery - DELETE statement to remove duplicates Group by IdBigQuery - 按 ID 删除重复项的 DELETE 语句
【发布时间】:2020-06-02 22:18:13
【问题描述】:

我正在尝试使用 DELETE 从我的 BigQuery 表中删除重复记录。

我找到了上述问题的多种解决方案,但大多数都使用CREATEREPLACESELECT

我发现使用DELETE 的最接近的解决方案是:

BigQuery - DELETE statement to remove duplicates

BigQuery Standard SQL: Delete Duplicates from Table

我对以下解决方案有后续问题:

#standardSQL
DELETE FROM `yourproject.yourdataset.duplicates`
WHERE STRUCT(id, loadTime) NOT IN (
    SELECT AS STRUCT id, MAX(loadTime) loadTime 
    FROM `yourproject.yourdataset.duplicates` where id= '123'
    GROUP BY id)

此语句从表中删除所有不满足NOT IN 条件的记录。例如,如果我的表格如下所示:

Id      Loadtime
123        5
123        4
456        2
321        1

上面的查询删除了除第一行之外的所有记录。 如何修改查询,使其仅删除第二行,即仅按 id 删除组?

最终的输出应该是:

 Id      Loadtime
 123        5
 456        2
 321        1

【问题讨论】:

  • 提供输入/初始数据和预期结果的示例
  • 选择 Loadtime 5 而不是 4 背后的逻辑是什么 - 你想留下更大的 Loadtime 还是其他原因?
  • 是的。对于每个 Id,我只想要 max(LoadTime) 的行

标签: google-bigquery duplicates delete-row


【解决方案1】:

下面应该按照你的期望工作

#standardSQL
DELETE FROM `yourproject.yourdataset.duplicates`
WHERE STRUCT(id, loadTime) NOT IN (
SELECT AS STRUCT id, MAX(loadTime) loadTime 
FROM `yourproject.yourdataset.duplicates` 
GROUP BY id)  

所以,在您的示例中 - 它只会删除第二行

Id  Loadtime     
123 4    

【讨论】:

  • 只保留满足子查询结果的1条记录,其余的删除。
  • 同一id 组中的其余部分 - 对吗?这不是你想要的吗?
  • 它正在删除 ID 为 456 和 521 的行。我刚刚从查询中删除了 id= '123' 的条件,它只删除了第 2 行并保留了第 1、第 3 和第 4 行。不知道为什么 where 子句会导致这种情况,但它现在可以工作了!感谢您的帮助
  • 是的,这正是我的回答所指向的。很高兴你成功了 :o)
猜你喜欢
  • 2018-06-16
  • 1970-01-01
  • 1970-01-01
  • 2022-08-03
  • 2013-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-25
相关资源
最近更新 更多