Удаление повторяющихся строк из таблицы 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)