Sql server 删除特定的重复记录sql server 2008
我的表中有重复记录,有以下3种情况:Sql server 删除特定的重复记录sql server 2008,sql-server,Sql Server,我的表中有重复记录,有以下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
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
我想删除所有重复记录,除了两行,第一行应该是添加日期最少的一行,第二行是添加日期之间的日期差为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
试试这个:
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))
问题是在record22344223
的源数据中有13条记录都是相同的
如果您只需要这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'
试试这个:
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))
问题是在record22344223
的源数据中有13条记录都是相同的
如果您只需要这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'
我使用了Test的表名,因为它没有提供
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
编辑:
注:预期结果显示22344222的第二行为5/6,但这不是4/22之后的45天。我的结果返回6/6的行。另外,如果我将22344224的6/6日期添加到源数据中,我的结果将返回5行。我使用了Test的表名,因为它没有提供
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
编辑:
注:预期结果显示22344222的第二行为5/6,但这不是4/22之后的45天。我的结果返回6/6的行。另外,如果我将22344224的6/6日期添加到源数据中,我的结果将返回5行。您是否可以更好地格式化它,即使用代码标记并将其放入表格布局?您是说“正好”45天,还是“至少”45天?正好45天之间的间隔是什么?如果45天之后没有记录怎么办?你会把它格式化得更好吗,即使用代码标签并将其放入表格布局?你的意思是“正好”45天,还是“至少”45天?正好45天之间的间隔是什么?如果45天之后没有记录呢?在这种情况下,只需要保留第一行。计算机如何仅删除第一行?它怎么知道哪个是第一个?这些行没有排序。如果有一个列主键,或者输入了日期,那么简单。当行相同时,无法使用单个标准SQL语句直接执行此操作。唯一的方法是创建一个新表,只使用与此表不同的值,删除此表并重命名新表。在这种情况下,只需保留第一行。计算机如何仅删除第一行?它怎么知道哪个是第一个?这些行没有排序。如果有一个列主键,或者输入了日期,那么简单。当行相同时,无法使用单个标准SQL语句直接执行此操作。唯一的方法是创建一个新表,其中只包含与此表不同的值,删除此表并重命名新表。