这对我来说很好,可以在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
并运行它以删除重复对象,但这引发了有关不正确的'('字符的错误。那不可能是正确的。错误必须归因于其他原因,但我不确定是什么。
答案 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');