2016-02-29 5 views
1

Ситуация довольно сложная для выражения в названии. Пример должен быть намного легче понять.SQL удаляет строки по разнице дат

Мой стол A:

uid  id  ticket   created_date 
001  1  movie  2015-01-23 08:23:16 
002  25  TV  2012-01-13 12:02:20 
003  1  movie  2015-02-01 07:15:36 
004  1  movie  2014-02-15 15:38:40 

Что мне нужно добиться того, чтобы удалить дубликаты записей, которые появляются в течение 31 дней друг с другом и сохраняют записи, которые появляются в первую очередь. Таким образом, приведенная выше таблица будет сокращена до B:

uid  id  ticket   created_date 
001  1  movie  2015-01-23 08:23:16 
002  25  TV  2012-01-13 12:02:20 
004  1  movie  2014-02-15 15:38:40 

, поскольку третий ряд в A были в течение 31 дней подряд 1 и оказалось позже, чем строки 1 (2015-02-01 против 2015-01-23) , поэтому он удаляется.

Есть ли чистый способ сделать это?

+0

Немного непонятно, что вы пытаетесь сделать здесь. Вы просто хотите удалить все строки для каждого id, где created_date> через 31 день после самого последнего created_date для этого идентификатора? Я должен сказать, что столбец с именем id, который позволяет дублировать, - это немного оксюморон. –

+0

Вы можете обратиться к этой теме http://stackoverflow.com/questions/20960679/sql-server-find-records-that-have-appeared-3-times-in-last-30-days – Amrutha

+0

@SeanLange Обновлено в ответ на ваш вопрос. Ответ на ваш вопрос - да. Фактически происходит то, что новые записи вставляются в таблицу каждый месяц. Иногда запись может быть изменена/обновлена, и новая запись с тем же идентификатором будет вставлена ​​в таблицу. Такие экземпляры происходят только в течение 31 дня со дня создания старой записи. Я хочу удалить эти дубликаты. Надеюсь, это понятно. – breezymri

ответ

1

Я хотел бы предложить следующий подход:

SELECT A.uid AS uid 
INTO #tempA 
FROM A 
    LEFT JOIN A AS B 
     ON A.id=B.id AND A.ticket=B.ticket 
WHERE DATEDIFF(SECOND,B.date,A.date) > 0 AND 
     DATEDIFF(SECOND,B.date,A.date) < 31*24*60*60; 

DELETE FROM A WHERE uid IN (SELECT uid FROM #tempA); 

Это предполагает, что «дублирующих записей» вы имеете в виду записи, которые имеют как идентичные id, а также идентичные ticket поля. Если это не так, вы должны соответствующим образом отрегулировать пункт ON.

+0

@breezymri Я принял ваше предложенное редактирование. Однако я больше знаком с MySQL, чем с SQL Server, и я не уверен, что даты в 'DATEDIFF' находятся в правильном порядке за то, что вы хотите. Если это не так, вы сохраните запись, которая появилась последним, а не первая. Убедитесь, что вы тестируете, что он работает так, как вы планировали. – OscarJ

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