我使用下面的查询来使用标准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中的正确方法?
答案 0 :(得分:5)
选项#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
)