Удалить дубликаты из таблицы в BigQuery - PullRequest
0 голосов
/ 25 октября 2018

Я нашел дубликаты в своей таблице, выполнив запрос, приведенный ниже.

SELECT name, id, count(1) as count
  FROM [myproject:dev.sample] 
  group by name, id 
  having count(1) > 1

Теперь я хотел бы удалить эти дубликаты на основе идентификатора и имени, используя оператор DML, но в нем показано сообщение «0 строк затронут».Я что-то упустил?

DELETE FROM PRD.GPBP WHERE
    id not in(select id from [myproject:dev.sample] GROUP BY id) and 
    name not in (select name from [myproject:dev.sample] GROUP BY name) 

Ответы [ 2 ]

0 голосов
/ 25 октября 2018

Запрос ниже (BigQuery Standard SQL) должен быть более оптимальным для устранения дублирования, как в вашем случае

#standardSQL
SELECT AS VALUE ANY_VALUE(t)
FROM `myproject.dev.sample` AS t
GROUP BY name, id

Если вы запускаете его из пользовательского интерфейса - вы можете просто установить Write Preference в Overwrite Tableи все готово

Или, если хотите, вы можете использовать DML INSERT для новой таблицы, а затем скопировать оригинал

Между тем, самый простой способ, как показано ниже (с использованием DDL)

#standardSQL
CREATE OR REPLACE TABLE `myproject.dev.sample` AS
SELECT * FROM (
  SELECT AS VALUE ANY_VALUE(t)
  FROM `myproject.dev.sample` AS t
  GROUP BY name, id
)
0 голосов
/ 25 октября 2018

Предлагаю создать новую таблицу без дубликатов.Удалите исходную таблицу и переименуйте новую таблицу в исходную таблицу.

Вы можете найти дубликаты, как показано ниже:

Create table new_table as 
Select name, id, ...... , put our remaining 10 cols here
FROM(
SELECT *, 
ROW_NUMBER() OVER(Partition by name , id Order by id) as rnk
FROM [myproject:dev.sample] 
)a
WHERE rnk = 1;

Затем отбросьте старую таблицу и переименуйте new_table со старым именем таблицы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...