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

May*_*ank 5 google-bigquery

我使用下面的查询来使用标准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
Run Code Online (Sandbox Code Playgroud)
Query Failed
Error: Syntax error: Expected "(" or keyword SELECT but got keyword DELETE at [5:5]
Run Code Online (Sandbox Code Playgroud)

任何人都可以帮我解决BigQuery中的正确方法吗?

Mik*_*ant 6

选项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 
Run Code Online (Sandbox Code Playgroud)

选项#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
)   
Run Code Online (Sandbox Code Playgroud)

您可能已经注意到,上面的选项使用DDL(CREATE TABLE)方法,并且可以使用一个已知的(来自您的问题)列 - CallRailCallId
另外,注意 - ORDER BY CallRailCallId在那里没有真正的作用因为GROUP BY和PARTITION BY完全是相同的提交.但是如果你更改字段,这将控制哪个确切的行(在几个重复中)"生存"(例如ORDER BY ts DESC- 参见下面的选项,了解ts可能是什么)

选项#3

此选项使用DML(DELETE FROM),但需要使用一些额外的列作为打破平局

例如,您有tsTIMESTAMP字段,并且您希望最新(基于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
  )
Run Code Online (Sandbox Code Playgroud)