2013-04-09 114 views
5

我需要从临时表中删除有问题的字段不完全相同的重复字段。从没有主键的临时表中删除重复的字段

例如,我有以下数据:

First Last  DOB 
John Johnson 10.01.02 
Steve Stephens 23.03.02 
John Johnson 2.02.99 
Dave Davies 3.03.03 

这里,有两个约翰·约翰逊的。我只想要一个约翰逊约翰逊 - 我不在乎哪一个。所以得到的表格将如下所示:

First Last  DOB 
John Johnson 10.01.02 
Steve Stephens 23.03.02 
Dave Davies 3.03.03 

我正在使用TSQL,但我宁愿使用非专有的SQL。

感谢

回答

1

嗯,我迟到了,但这里是一个数据库无关的解决方案:

SELECT A.* 
FROM YourTable A 
INNER JOIN (SELECT [First], [Last], MAX(DOB) MaxDob 
      FROM YourTable 
      GROUP BY [First], [Last]) B 
    ON A.[First] = B.[First] 
    AND A.[Last] = B.[Last] 
    AND A.DOB = B.MaxDob 

And here is a sqlfiddle与它的演示。 (谢谢@JW小提琴的模式)

6

SQL Server支持使用Common Table ExpressionWindow Functions。随着使用ROW_NUMBER(),并将每个组提供排名,就可以过滤掉记录其等级大于一(这是重复一个

WITH records 
AS 
(
    SELECT [First], [Last], DOB, 
      ROW_NUMBER() OVER (PARTITION BY [First], [Last] ORDER BY DOB) rn 
    FROM TableName 
) 
DELETE FROM records WHERE rn > 1 
0

您可以使用CTEROW_NUMBER()来完成此操作:

WITH CTE 
AS 
(
    SELECT 
     First, 
     Last, 
     DOB, 
     ROW_NUMBER() OVER (PARTITION BY First, Last ORDER BY DOB) RN 
    FROM 
     Table1 
) 

DELETE FROM CTE WHERE RN > 1 

SQL FIDDLE DEMO

2

您可以使用CTEROW_NUMBER

WITH CTE AS 
(
    SELECT RN = ROW_NUMBER() OVER (PARTITION BY First, Last ORDER BY First, Last) 
    FROM TempTable 
) 
DELETE CTE 
WHERE RN > 1; 

DEMO