Sql 将查找重复项查询转换为删除重复项查询

Sql 将查找重复项查询转换为删除重复项查询,sql,google-bigquery,Sql,Google Bigquery,在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

在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*改为Delete,然后运行它来删除重复,但是它抛出了一个错误,关于一个不正确的字符。那不可能是对的。该错误必须归因于其他原因,但我不确定是什么原因。

首先,您对ROW_号码的调用非常有意义,因为您从未提供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子句中的子查询

它抛出了一个关于错误字符的错误。那不可能 对

这完全正确。解析器希望在FROM之后看到表名,而不是看到并抛出一个错误。请参阅Tim Biegeleisen关于如何修改SQL的回答


您可能需要一个存在于其中的:

删除 来自corp-analytics.Reports.Metrics作为c 哪里有 按KeyReport、Analytics、Description和AsOfDate选择分区上的行数 按某列排序 来自corp-analytics.Reports.Metrics作为c2 其中d.id=d2.id=1和
AsOfDate于‘2019年3月1日’、‘2019年1月17日’发布

表中没有唯一的ID。如何修改SQL以解决此问题?另外,我不能删除复制记录吗?不知何故,这是在创建一个名为“Updates”的新表。必须有某种设置来控制这一点,因为我没有明确告诉它这样做。
DELETE [FROM] target_name [alias]
WHERE condition