Преобразовать запрос поиска дубликатов в запрос удаления дубликатов - PullRequest
0 голосов
/ 23 января 2019

Это прекрасно работает для меня, чтобы найти дубликаты в таблице в Google Big Query.

SELECT *
FROM (
  SELECT
      *,
      ROW_NUMBER()
          OVER (PARTITION BY KeyReport,Analytics,Description,AsOfDate)
          row_number
  FROM `corp-analytics.Reports.Metrics`
)
WHERE row_number > 1 AND AsOfDate IN('01-03-2019','01-17-2019')

Я подумал, что могу просто изменить Select * на Delete и запустить его, чтобы удалить дубликаты,но он выдает ошибку о неправильном символе '('. Это не может быть правдой. Ошибка должна быть связана с чем-то другим, но я не уверен, что.

Ответы [ 3 ]

0 голосов
/ 23 января 2019

выдает ошибку о неправильном символе '('. Это не может быть правый.

Это совершенно верно. Parser ожидает увидеть имя таблицы после FROM, вместо этого он видит '(' и выдает ошибку. См. Ответ Tim Biegeleisen о том, как изменить ваш SQL.

https://cloud.google.com/bigquery/docs/reference/standard-sql/dml-syntax

DELETE [FROM] target_name [alias]
WHERE condition
0 голосов
/ 23 января 2019

Вам может понадобиться СУЩЕСТВУЮЩИЙ там:

DELETE FROM corp-analytics.Reports.Metrics AS c ГДЕ СУЩЕСТВУЕТ (SELECT ROW_NUMBER () OVER (PARTITION BY KeyReport, Analytics, Description, AsOfDate ЗАКАЗАТЬ по some_column) FROM corp-analytics.Reports.Metrics AS c2 ГДЕ d.id = d2.id) = 1 И AsOfDate IN ('01 -03-2019 ', '01 -17-2019');

0 голосов
/ 23 января 2019

Прежде всего, ваш вызов ROW_NUMBER имеет большой смысл, потому что вы никогда не предоставили предложение ORDER BY.Без этого вы, в основном, говорите BigQuery, что вам не важно, какой порядок используется для определения номера строки.Кроме этого, вот запрос, который вы можете попытаться удалить своими записями:

DELETE
FROM corp-analytics.Reports.Metrics AS c
WHERE
    (SELECT ROW_NUMBER() OVER (PARTITION BY KeyReport, Analytics, Description, AsOfDate
                               ORDER BY some_column)
     FROM corp-analytics.Reports.Metrics AS c2
     WHERE d.id = d2.id) = 1 AND
    AsOfDate IN ('01-03-2019', '01-17-2019');

Предполагается, что существует некоторый первичный ключ или другой уникальный ключ, столбец id, который можно использовать для однозначной идентификации любогозапись в вашей таблице.Если этого не существует, то мы должны сопоставить подзапрос в предложении WHERE, используя другой метод.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...