2013-04-09 118 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