Я нашел дубликаты в своей таблице, выполнив запрос ниже.
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, согласен. Но delete
удалит все записи для этой группы name and id
.
id не уникален в моей таблице .. вот почему я беру дубликаты по имени и идентификатору
@NikhilBOORLA У вас есть столбец идентификации на вашем столе? Что-нибудь, чтобы различать запись 1 и запись 2 с одинаковым идентификатором и именем?
@NikhilBOORLA Я отправил ответ. Сообщите мне, если это сработает.
Я предлагаю вам создать новую таблицу без дубликатов. Отбросьте исходную таблицу и переименуйте новую таблицу в исходную.
Вы можете найти дубликаты, как показано ниже:
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
)
@RyanWilson Если он удалит, используя свой 1-й запрос, он в конечном итоге удалит все записи для группы, а не только дубликаты.