Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/reporting-services/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 删除特定的重复记录sql server 2008_Sql Server - Fatal编程技术网

Sql server 删除特定的重复记录sql server 2008

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

我的表中有重复记录,有以下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
我想删除所有重复记录,除了两行,第一行应该是添加日期最少的一行,第二行是添加日期之间的日期差为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))
问题是在record
22344223
的源数据中有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))
问题是在record
22344223
的源数据中有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语句直接执行此操作。唯一的方法是创建一个新表,其中只包含与此表不同的值,删除此表并重命名新表。