删除表中具有两个相同列值的记录

dyn*_*obo 1 sql sql-server sql-server-2008

我有这样一张桌子:

Location   E-Mail            Name          Language      Creation Time
-----------------------------------------------------------------------
D          max@gmx.net       Max           de            19:06:00  <-- A
D          peter@outlook.com Peter         en            19:10:00
D          lisa@google.com   Lisa          en            17:39:00
E          tom@hotmail.com   Tom           fr            05:00:00  <-- B
E          carl@gmx.net      Carl          en            09:01:00
D          max@gmx.net       Max           en            17:45:00  <-- A
D          max@gmx.net       Mike          de            17:45:00  <-- A
E          tom@hotmail.com   Tom           de            06:00:00  <-- B
Run Code Online (Sandbox Code Playgroud)

我想识别每条记录,其中LocationAND E-Mail是相同的,删除"重复"并保留最新记录.如果创建时间相同(A),则无关紧要,删除哪条记录.

结果表应该是:

Location   E-Mail            Name          Language      Creation Time
-----------------------------------------------------------------------
D          peter@outlook.com Peter         en            19:10:00
D          lisa@google.com   Lisa          en            17:39:00
E          tom@hotmail.com   Tom           fr            05:00:00  <-- B
E          carl@gmx.net      Carl          en            09:01:00
D          max@gmx.net       Mike          de            17:45:00  <-- A
Run Code Online (Sandbox Code Playgroud)

由于表格很长,解决方案应该很快.:-)

谢谢你的每一个提示!

干杯,霍尔格

mar*_*c_s 6

一种方法是使用CTE(公用表表达式),如果您使用的是SQL Server 2005及更高版本(在这方面您不够具体).

使用此CTE,您可以按照某些条件(即您的(Location, EMail)- )对数据进行分区,并为每个"分区"的所有行启用SQL Server编号,按降序排序CreationTime.

所以尝试这样的事情:

;WITH NewestData AS
(
   SELECT 
       Location, EMail, Name, Language, CreationTime,
       RowNum = ROW_NUMBER() OVER(PARTITION BY Location, EMail 
                                  ORDER BY CreationTime DESC)
   FROM 
       dbo.YourTableNameHere
)
DELETE FROM NewestData
WHERE RowNum > 1
Run Code Online (Sandbox Code Playgroud)

在这里,我只为每个"分区"(即每个(Location, EMail)元组)选择"第一个"(最新)条目- 按CreationTime降序排序.

因此,对于每一个最新的项目(Location, EMail)元组具有的价值1为它的RowNum任何"重复"必须大于值1 -所以我删除了所有这些"复制" -就大功告成了!