Удалить дубликаты из таблицы в bigquery

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

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) 

@RyanWilson Если он удалит, используя свой 1-й запрос, он в конечном итоге удалит все записи для группы, а не только дубликаты.

Mayank Porwal 25.10.2018 14:53

вы можете упомянуть запрос?

Nikhil BOORLA 25.10.2018 14:54

@RyanWilson Его запрос вернет все записи со счетом больше 1, согласен. Но delete удалит все записи для этой группы name and id.

Mayank Porwal 25.10.2018 14:57

id не уникален в моей таблице .. вот почему я беру дубликаты по имени и идентификатору

Nikhil BOORLA 25.10.2018 15:01

@NikhilBOORLA У вас есть столбец идентификации на вашем столе? Что-нибудь, чтобы различать запись 1 и запись 2 с одинаковым идентификатором и именем?

Ryan Wilson 25.10.2018 15:02

@NikhilBOORLA Я отправил ответ. Сообщите мне, если это сработает.

Mayank Porwal 25.10.2018 15:04
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
6
4 329
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

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

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

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 со старым именем таблицы.

Ниже запрос (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
)

Другие вопросы по теме