Дублирующиеся строки в сложной схеме в разделе больших запросов - PullRequest
0 голосов
/ 10 февраля 2020

Я прочитал некоторые темы, но слишком мало знаю sql, чтобы решить мою проблему. У меня есть таблица со сложной схемой с записями и вложенными полями.

Ниже вы видите запрос, который находит точную строку, которую мне нужно дедуплицировать.

SELECT * 
FROM my-data-project-214805.rfid_data.rfid_data_table 
WHERE DATE(_PARTITIONTIME) = "2020-02-07"  
AND DetectorDataMessage.Header.MessageID ='478993053'

DetectorDataMessage.Header.MessageID должен быть уникальным.

Как удалить одну из этих строк? (их два)

Если возможно, я хотел бы дедуплицировать всю таблицу, но она разбита на разделы, и я не могу сделать это правильно. Я пробую предложения в следующих темах, но получаю эту ошибку Column DetectorDataMessage of type STRUCT cannot be used in...

Интересующие темы: Дублирующиеся строки в разделе BigQuery Удаление дублирующихся строк из таблицы BigQuery

Есть предложения? Можете ли вы направить меня в правильном направлении?

Ответы [ 2 ]

0 голосов
/ 10 февраля 2020

Попробуйте использовать MERGE, чтобы удалить существующие повторяющиеся строки и одну идентичную строку. В этом случае я собираюсь указать конкретную c дату и идентификатор, как в вопросе:

MERGE `temp.many_random` t
USING (
  # choose a single row to replace the duplicates
  SELECT a.*
  FROM (
    SELECT ANY_VALUE(a) a
    FROM `temp.many_random` a
    WHERE DATE(_PARTITIONTIME)='2018-10-01'
    AND DetectorDataMessage.Header.MessageID ='478993053'
    GROUP BY _PARTITIONTIME, DetectorDataMessage.Header.MessageID 
  )
)
ON FALSE
WHEN NOT MATCHED BY SOURCE 
  # delete the duplicates
  AND DATE(_PARTITIONTIME)='2018-10-01'  
  AND DetectorDataMessage.Header.MessageID ='478993053'
THEN DELETE
WHEN NOT MATCHED BY TARGET THEN INSERT ROW

На основании этого ответа:

0 голосов
/ 10 февраля 2020

Если все значения в повторяющихся строках совпадают, просто используйте «SELECT different». Если нет, я бы использовал функцию ROW_NUMBER (), чтобы создать ранг для каждого уникального индекса, а затем просто выбрать первый ранг.

Я не знаю, какие у вас столбцы, но вот пример:

WITH subquery as
(select MessageId
ROW_NUMBER() OVER(partition by MessageID order by MessageId ASC) AS rank
)
select *
from subquery
where rank = 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...