【发布时间】:2019-05-08 02:27:27
【问题描述】:
我有按插入时间分区的 BQ 表。 我正在尝试从表中删除重复项。这些是真正的重复:对于 2 个重复的行,所有列都是相等的 - 当然,拥有唯一键可能会有所帮助:-(
起初我尝试了一个 SELECT 查询来枚举重复项并删除它们:
SELECT
* EXCEPT(row_number)
FROM (
SELECT
*,
ROW_NUMBER() OVER (PARTITION BY id_column) row_number
FROM
`mytable`)
WHERE
row_number = 1
这会产生唯一的行,但会创建一个不包含分区数据的新表 - 所以不好。
我见过answer here,它指出保留分区的唯一方法是使用上述查询逐个检查它们并保存到特定的目标表分区。
我真正想做的是使用 DML DELETE 删除重复的行。我尝试了类似于this answer suggested:
DELETE
FROM `mytable` AS d
WHERE (SELECT ROW_NUMBER() OVER (PARTITION BY id_column)
FROM `mytable ` AS d2
WHERE d.id = d2.id) > 1;
但接受的答案不起作用并导致 BQ 错误:
Error: Correlated subqueries that reference other tables are not supported unless they can be de-correlated, such as by transforming them into an efficient JOIN
如果有人能提供一种更简单(DML 或其他)的方法来处理这个问题,那就太好了,这样我就不需要单独遍历所有分区了。
【问题讨论】:
-
嗨@MikhailBerlyant,不确定这与我有什么关系,因为答案假定每行都有一个唯一的附加列(loadTime)。我怎样才能适应我的情况?
标签: google-bigquery bigquery-standard-sql