2015-12-30 4 views
0

Как удалить дублируемую запись на основе узкого временного интервала? Каждая запись имеет уникальную дату (дата дампа данных). Существует общий серийный номер и номер статуса между дубликатами - я хочу только вытащить один дубликат за день до или позже - и быть ясным: в будущем я могу записать другую версию той же записи, содержащую тот же серийный/статус номер комбинация, который я бы хочу сохранить - (другие аспекты записи будут изменены). Моя таблица архивов гарантирует, что нет повторяющихся записей на основе уникальной даты данных и серийного номера ... но я не могу понять, как справиться с той же самой записью, которая появляется на следующий день, и не имея возможности просто группировать по номеру статуса, поскольку этот номер может отображаться много раз в течение года, и мне нужно их хранить.Удалить дубликаты записей 1-й день

Это моя теоретическая попытка, которая будет работать ежедневно:

DELETE `t` 
FROM `archive_table` as `t` JOIN 
(SELECT `data-dump-date`, COUNT(`serial-number`)as `count` FROM 
`archive_table` 
WHERE 

`data-dump-date` >= `todays-date` -1 

GROUP BY `serial-number`,`status-number` HAVING COUNT(*) > 1) as `g` 
ON `t`.`data-dump-date` = `g`.`data-dump-date` 
AND `t`.`serial-number` = `g`.`serial-number` 
+0

Это не ответ на ваш вопрос, но одна вещь, которую вы могли бы сделать, это не допустить, чтобы дубликаты были вставлены путем проверки ваших критериев при их вставке ... –

+0

Это хороший момент, я не заглянул в как я могу написать запрос. – photocode

ответ

1

У вас есть возможность группировать по номеру статуса - просто есть CONCAT() первый, так что вы можете различать по данным также в этой группе ,

SELECT data-dump-date, serial-number, count(*) FROM archive_table GROUP BY CONCAT(data-dump-date, serial-number)

Чуть дороже запросов и два других предпочтительных вариантов было бы не написать в первую очередь, или иметь фактические уникальные сериальные номера. Вместо этого вы можете выбрать CONCAT() для записи, так как это будет только два поля и повлиять на одну строку, а не на чтение в соответствии с моим запросом, который повлияет на всю таблицу.

Непонятная причина, по которой вы не могли написать как отдельные поля, так и результат CONTAT(), за исключением того, что вы вводите потенциал, чтобы иметь аномалии между полями, потому что вы скопировали данные и дважды их записывали. то есть. если вы UPDATE этой строки, то вам нужно будет UPDATE обе копии ваших данных в этой строке.

Смежные вопросы