Удалить самые старые повторяющиеся строки из таблицы BigQuery - PullRequest
0 голосов
/ 24 апреля 2019

У меня есть таблица с> 70M строк данных и 2M дубликатов.Я хочу очистить дубликаты, сохранив последнюю исходную строку.

Я нашел несколько решений отсюда - ссылка

, в которых решения предназначены только для очистки дубликатов иНе сохранять последние данные среди дубликатов.

Вот еще одно распространенное решение:

;WITH cte 
     AS (SELECT Row_number() OVER (partition BY id ORDER BY 
                updatedAt 
                DESC, 
                status DESC) RN 
         FROM   MainTable) 
DELETE FROM cte 
WHERE  RN > 1 

Но оно не поддерживается в BigQuery.

Ответы [ 2 ]

1 голос
/ 24 апреля 2019

Вот обходной путь, который заменяет существующую таблицу уникальными строками и недавними исходными строками.

CREATE OR REPLACE TABLE
  `MainTable` AS
SELECT
  id,
  acctId,
  appId,
  createdAt,
  startTime,
  subAcctId,
  type,
  updatedAt,
  userId
FROM (
  SELECT
    *,
    ROW_NUMBER() OVER (PARTITION BY id ORDER BY updatedAt DESC -- the first row among duplicates will be kept, other rows will be removed
      ) RN
  FROM
    `MainTable`)
WHERE
  RN = 1

Поскольку у нас нет возможности удалить конкретный столбец (rn), необходимо выбрать необходимые столбцы при замене существующей таблицы.

Надеюсь, это кому-нибудь поможет. Пожалуйста, поделитесь, если у вас есть какие-либо лучшие решения.

0 голосов
/ 26 апреля 2019

Ниже для BigQuery Standard SQL

CREATE OR REPLACE TABLE
  `MainTable` AS
SELECT * EXCEPT(RN)
FROM (
  SELECT
    *,
    ROW_NUMBER() OVER (PARTITION BY id ORDER BY updatedAt DESC -- the first row among duplicates will be kept, other rows will be removed
      ) RN
  FROM
    `MainTable`)
WHERE
  RN = 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...