BigQuery 标准 SQL:从表中删除重复项

Posted

技术标签:

【中文标题】BigQuery 标准 SQL:从表中删除重复项【英文标题】:BigQuery Standard SQL: Delete Duplicates from Table 【发布时间】:2018-05-25 07:39:58 【问题描述】:

我正在使用以下查询使用标准 sql 从 bigquery 中删除重复记录。但它抛出错误

with cte as (
select * ,row_number()over (partition by CallRailCallId order by CallRailCallId) as rn
from `encoremarketingtest.EncoreMarketingTest.CallRailCall2` )

delete
 from cte
where rn>1
Query Failed
Error: Syntax error: Expected "(" or keyword SELECT but got keyword DELETE at [5:5]

谁能帮助我在 BigQuery 中使用正确的方法?

【问题讨论】:

尝试从 cte 中删除,其中 rn>1; 试过但同样的错误 【参考方案1】:

选项#1

CREATE OR REPLACE TABLE `project.dataset.your_table` AS
SELECT * EXCEPT(rn)
FROM (
  SELECT *, ROW_NUMBER() OVER(PARTITION BY CallRailCallId ORDER BY CallRailCallId) rn
  FROM `project.dataset.your_table`
) 
WHERE rn = 1 

选项 #2

CREATE OR REPLACE TABLE `project.dataset.your_table` AS
SELECT row.*
FROM (
  SELECT ARRAY_AGG(t ORDER BY CallRailCallId LIMIT 1)[OFFSET(0)] row
  FROM `project.dataset.your_table` t
  GROUP BY CallRailCallId
)   

您可能已经注意到,上述选项使用DDL(CREATE TABLE) 方法,这就是可以只使用一个已知(来自您的问题)列的地方 - CallRailCallId 另外,请注意 - ORDER BY CallRailCallId 在那里没有真正的作用,因为 GROUP BY 和 PARTITION BY 是完全相同的文件。但是,如果您更改该字段,这将控制哪一行(从少数重复项中)“存活”(例如 ORDER BY ts DESC - 请参阅下面的选项了解 ts 可能是什么)

选项#3

此选项使用DML(DELETE FROM),但需要使用一些额外的列来作为决胜局

例如,您有 ts TIMESTAMP 字段,并且您希望最新(基于 ts)行继续存在

DELETE FROM `project.dataset.your_table`
WHERE STRUCT(CallRailCallId, ts) NOT IN (
  SELECT AS STRUCT CallRailCallId, MAX(ts) ts
  FROM `project.dataset.your_table`
  GROUP BY CallRailCallId
  )

【讨论】:

@mayank - 你有机会尝试吗? 第三个选项不起作用,第一个对我有用,我没有尝试第二个选项

以上是关于BigQuery 标准 SQL:从表中删除重复项的主要内容,如果未能解决你的问题,请参考以下文章

从 BigQuery 中删除重复记录

如何从表中删除重复值 [重复]

BigQuery 范围装饰器重复问题

在新的 BigQuery 标准 SQL 的数组中使用结构

删除sql视图中的重复记录

如何从表中删除重复记录? [复制]