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

时间:2019-01-22 21:32:39

标签: 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 AsOfDate IN('01-03-2019','01-17-2019')

我以为我可以将Select *更改为Delete并运行它以删除重复对象,但这引发了有关不正确的'('字符的错误。那不可能是正确的。错误必须归因于其他原因,但我不确定是什么。

3 个答案:

答案 0 :(得分:1)

首先,您对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子句中的子查询。

答案 1 :(得分:0)

  

它抛出有关不正确的'('字符的错误。   是的。

完全正确。解析器希望在FROM后面看到表名,而是看到'('并抛出错误。请参见Tim Biegeleisen关于如何修改SQL的答案。

https://cloud.google.com/bigquery/docs/reference/standard-sql/dml-syntax

DELETE [FROM] target_name [alias]
WHERE condition

答案 2 :(得分:0)

您可能在那里需要一个EXISTS:

删除 来自corp-analytics.Reports.Metrics AS c 存在的地方     (SELECT ROW_NUMBER()OVER(按KeyReport,分析,说明,AsOfDate划分)                                按some_column排序)      从corp-analytics.Reports.Metrics AS c2      d.id = d2.id)= 1并且     AsOfDate IN('01 -03-2019','01 -17-2019');