BigQuery - оператор DELETE для удаления дубликатов группы по идентификатору - PullRequest
1 голос
/ 18 февраля 2020

Я пытаюсь использовать DELETE, чтобы удалить дубликаты записей из моей таблицы BigQuery.

Я нашел несколько решений вышеуказанного вопроса, но большинство из них используют CREATE, REPLACE или SELECT .

Ближайшее решение с использованием DELETE, которое я нашел, было:

BigQuery - оператор DELETE для удаления дубликатов

BigQuery Standard SQL: Удалить дубликаты из таблицы

У меня есть дополнительные вопросы по приведенному ниже решению:

#standardSQL
DELETE FROM `yourproject.yourdataset.duplicates`
WHERE STRUCT(id, loadTime) NOT IN (
    SELECT AS STRUCT id, MAX(loadTime) loadTime 
    FROM `yourproject.yourdataset.duplicates` where id= '123'
    GROUP BY id)

Этот оператор удаляет все записи из таблицы, которая не удовлетворяет NOT IN состояние. Например, если моя таблица выглядит следующим образом:

Id      Loadtime
123        5
123        4
456        2
321        1

Приведенный выше запрос удаляет все записи, кроме первой строки. Как я могу изменить запрос так, чтобы он удалял только 2-ю строку, т.е. он удаляет только группу по идентификатору?

Окончательный результат должен быть:

 Id      Loadtime
 123        5
 456        2
 321        1

1 Ответ

1 голос
/ 18 февраля 2020

Ниже должно работать в соответствии с вашими ожиданиями

#standardSQL
DELETE FROM `yourproject.yourdataset.duplicates`
WHERE STRUCT(id, loadTime) NOT IN (
SELECT AS STRUCT id, MAX(loadTime) loadTime 
FROM `yourproject.yourdataset.duplicates` 
GROUP BY id)  

, поэтому в вашем примере - удалит ТОЛЬКО вторую строку

Id  Loadtime     
123 4    
...