Удаление повторяющихся строк из таблицы BigQuery
У меня есть таблица с >1м строк и 20 столбцов.
в моей таблице (tableX) я определил дубликаты записей (~80k) в одном конкретном столбце (troubleColumn).
Если возможно, я хотел бы сохранить исходное имя таблицы и удалить дубликаты записей из моего проблемного столбца, иначе я мог бы создать новую таблицу (tableXfinal) с той же схемой, но без дубликатов.
Я не владею SQL или любым другим программированием пожалуйста, простите мое невежество.
delete from Accidents.CleanedFilledCombined
where Fixed_Accident_Index
in(select Fixed_Accident_Index from Accidents.CleanedFilledCombined
group by Fixed_Accident_Index
having count(Fixed_Accident_Index) >1);
3 ответов
вы можете удалить дубликаты, выполнив запрос, который перезаписывает вашу таблицу (вы можете использовать ту же таблицу, что и назначение, или вы можете создать новую таблицу, проверить, что у нее есть то, что вы хотите, а затем скопировать ее поверх старой таблицы).
запрос, который должен работать здесь:
SELECT *
FROM (
SELECT
*,
ROW_NUMBER()
OVER (PARTITION BY Fixed_Accident_Index)
row_number
FROM Accidents.CleanedFilledCombined
)
WHERE row_number = 1
альтернатива ответу Джордана-этот масштабируется лучше, когда имеет слишком много дубликатов:
#standardSQL
SELECT event.* FROM (
SELECT ARRAY_AGG(
t ORDER BY t.created_at DESC LIMIT 1
)[OFFSET(0)] event
FROM `githubarchive.month.201706` t
# GROUP BY the id you are de-duplicating by
GROUP BY actor.id
)
или более короткая версия (принимает любую строку, а не самую новую версию):
SELECT k.*
FROM (
SELECT ARRAY_AGG(x LIMIT 1)[OFFSET(0)] k
FROM `fh-bigquery.reddit_comments.2017_01` x
GROUP BY id
)
Если в вашей схеме нет записей-ниже variation
ответа Джордана будет достаточно хорошо работать с написанием над той же таблицей или новой и т. д.
SELECT <list of original fields>
FROM (
SELECT *, ROW_NUMBER() OVER (PARTITION BY Fixed_Accident_Index) AS pos,
FROM Accidents.CleanedFilledCombined
)
WHERE pos = 1
в более общем случае-со сложной схемой с записями / сетчатыми полями и т. д. - выше подход может быть проблемой.
Я бы предложил попробовать использовать Tabledata: insertAll API с строки[].insertId установите для каждой строки значение fixed_accident_index. В этом случае дубликат строки будут устранены BigQuery
конечно, это будет включать некоторое кодирование на стороне клиента, поэтому может быть не актуально для этого конкретного вопроса. Я не пробовал этот подход сам, но чувствую, что было бы интересно попробовать: o)