BigQuery Standard SQL: удаление дубликатов из таблицы - PullRequest
0 голосов
/ 25 мая 2018

Я использую запрос ниже, чтобы удалить дубликаты записей из BigQuery, используя стандартный SQL.но это выдает ошибку

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?

1 Ответ

0 голосов
/ 26 мая 2018

Опция # 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 не играет никакой реальной роли, потому что GROUPBY и PARTITION BY находятся в одной и той же области.Но если вы измените поле, это будет контролировать, какую именно строку (из нескольких дубликатов) «выжить» (например, ORDER BY ts DESC - см. Опцию ниже, чтобы узнать, что может быть ts)

Опция № 3

Эта опция использует DML (УДАЛИТЬ ОТ), но требует использования дополнительного столбца для использования в качестве прерывателя связей

Например, у вас есть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
  )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...