supprimer des loggings en double spécifiques SQL Server 2008

J'ai des loggings en double dans ma table avec le scénario ci-dessous 3:

record Adddate 22344222 2016-04-22 00:00:00.000 22344222 2016-05-06 00:00:00.000 22344222 2016-06-06 00:00:00.000 22344222 2016-06-20 00:00:00.000 22344222 2016-07-25 00:00:00.000 22344222 2016-09-26 00:00:00.000 22344222 2016-10-03 00:00:00.000 22344222 2016-10-26 00:00:00.000 22344222 2016-10-27 00:00:00.000 22344222 2016-10-28 00:00:00.000 22344223 2016-04-22 00:00:00.000 22344223 2016-04-22 00:00:00.000 22344223 2016-04-22 00:00:00.000 22344223 2016-04-22 00:00:00.000 22344223 2016-04-22 00:00:00.000 22344223 2016-04-22 00:00:00.000 22344223 2016-04-22 00:00:00.000 22344223 2016-04-22 00:00:00.000 22344223 2016-04-22 00:00:00.000 22344223 2016-04-22 00:00:00.000 22344224 2016-04-22 00:00:00.000 22344224 2016-04-23 00:00:00.000 22344224 2016-04-24 00:00:00.000 22344224 2016-04-25 00:00:00.000 22344224 2016-04-26 00:00:00.000 22344224 2016-06-10 00:00:00.000 

Je veux supprimer tous les loggings en double à l'exception des 2 lignes où la 1ère ligne doit être celle qui a le less de date d'ajout et la 2ème ligne où la différence de date entre les additions est de 45 jours.

Dans le scénario ci-dessus trois, je devrais être en mesure de préserver uniquement datatables ci-dessous

 record Adddate 22344222 2016-04-22 00:00:00.000 22344222 2016-05-06 00:00:00.000 22344223 2016-04-22 00:00:00.000 22344224 2016-04-22 00:00:00.000 22344224 2016-06-06 00:00:00.000 

essaye ça:

 With mad(record, minDat) as (Select record, min(addDate) From myTable group by record) Delete t from mytable t join mad m on m.record = t.Record where t.adddate not in (m.minDat, dateadd(day, 45, m.minDat)) 

problème est que vous avez 13 loggings dans datatables source pour l'logging 22344223 qui sont tous les mêmes.

Si vous voulez seulement une copy de ces 13 duplicates, puis, après avoir supprimé les loggings,

 create table dbo.temp (record integer, addDate date) Insert dbo.temp(record, addDate) Select distinct record, addDate from mytable -- ------------------------ Drop table myTable -- ------------------------ exec sp_Rename 'dbo.temp', 'dbo.mytable' 

J'ai utilisé un nom de table de Test car il n'était pas fourni.

 WITH cte AS (SELECT *, NumSeq = ROW_NUMBER() OVER (PARTITION BY record ORDER BY Adddate) FROM dbo.Test) DELETE FROM cte WHERE cte.NumSeq > 1 AND NOT EXISTS ( SELECT 1 FROM cte AS A INNER JOIN cte AS B ON B.NumSeq > 1 AND DATEDIFF( DAY, A.Adddate, B.Adddate ) = 45 AND A.record = B.record WHERE A.NumSeq = 1 AND cte.record = B.record AND cte.Adddate = B.Adddate ); SELECT * FROM dbo.Test; 

Cela renvoie 4 lignes:

22344222 2016-04-22 00: 00: 00.000

22344222 2016-06-06 00: 00: 00.000

22344223 2016-04-22 00: 00: 00.000

22344224 2016-04-22 00: 00: 00.000

Modifier: Notez que les résultats souhaités montrent 5/6 comme 2ème ligne pour 22344222, mais ce n'est pas 45 jours après le 4/22. Mon résultat renvoie la ligne pour 6/6. En outre, si j'ajoute la date 6/6 pour 22344224 aux données source, mon résultat returnnera 5 lignes à la place.