2016-12-12 4 views
1

У меня есть повторяющиеся записи в моей таблице с ниже 3 сценария:удалить конкретные дубликаты записей SQL Server 2008

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 

Я хочу, чтобы удалить все дубликаты записей для 2-х строк, где первая строка должна быть одна, кроме с наименьшей добавленной датой и второй строкой, где разница дат между добавлением составляет 45 дней.

В приведенном выше три сценария я должен быть в состоянии сохранить только следующие данные

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 
+0

Вы отформатируете это лучше, I.E используйте теги кода и поместите его в табличный макет. – gh9

+0

Вы имеете в виду «ровно» 45 дней или «как минимум» 45 дней? –

+0

ровно 45 дней – user1415173

ответ

5

попробовать это:

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)) 

проблема в том, у вас есть 13 записей в исходных данных для записи 22344223 что все одинаковы.

Если вы хотите только одну копию этих 13 дублей, а затем, после удаления записей,

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' 
+0

в этом сценарии только 1-я строка должна быть сохранена – user1415173

+0

Как удалить только первую строку компьютера? Как он узнает, что является первым? строки не упорядочены. Если был начальный ключ столбца или введенная дата, тогда легко. Когда строки одинаковы, нет никакого способа сделать это непосредственно с помощью одного стандартного оператора SQL. единственный способ - создать новую таблицу с только отличными от этого значения, отбросить ее и переименовать новую. –

0

Я использовал имя таблицы из теста, так как она не была предоставлена.

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; 

Это возвращает 4 строки:

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

Edit: Обратите внимание, что желаемые результаты показывают 5/6 как 2-я строка для 22344222, но это не через 45 дней после 4/22. Мой результат возвращает строку для 6/6. Кроме того, если я добавлю дату 6/6 для 22344224 к исходным данным, мой результат вернет 5 строк.

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