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:从表中删除重复项的主要内容,如果未能解决你的问题,请参考以下文章