sql - 将 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
并运行它来删除欺骗,但它会抛出一个关于不正确的 '(' 字符的错误。这不可能是正确的。错误必须归因于其他原因,但我不是确定什么。
解决方案
首先,您的致电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
使用其他方法关联子句中的子查询。