首页 > 解决方案 > 将 Find Dupes 查询转换为 Delete Dupes 查询

问题描述

这对我来说完全可以在 Google Big Query 的表中找到骗子。

SELECT *
FROM (
  SELECT
      *,
      ROW_NUMBER()
          OVER (PARTITION BY KeyReport,Analytics,Description,AsOfDate)
          row_number
  FROM `corp-analytics.Reports.Metrics`
)
WHERE row_number > 1 AND AsOfDate IN('01-03-2019','01-17-2019')

我以为我可以更改Select *toDelete并运行它来删除欺骗,但它会抛出一个关于不正确的 '(' 字符的错误。这不可能是正确的。错误必须归因于其他原因,但我不是确定什么。

标签: sqlgoogle-bigquery

解决方案


首先,您的致电ROW_NUMBER确实很有意义,因为您从未提供过ORDER BY条款。如果没有这个,您基本上是在告诉 BigQuery,您并不真正关心用于确定行号的顺序。除此之外,这里有一个查询,您可以尝试删除您的记录:

DELETE
FROM corp-analytics.Reports.Metrics AS c
WHERE
    (SELECT ROW_NUMBER() OVER (PARTITION BY KeyReport, Analytics, Description, AsOfDate
                               ORDER BY some_column)
     FROM corp-analytics.Reports.Metrics AS c2
     WHERE d.id = d2.id) = 1 AND
    AsOfDate IN ('01-03-2019', '01-17-2019');

这假定存在一些id可用于唯一标识表中任何记录的主键或其他唯一键列。如果不存在,那么我们将不得不WHERE使用其他方法关联子句中的子查询。


推荐阅读