2013-04-09 5 views
5

Ich muss doppelte Felder aus einer temporären Tabelle entfernen, in denen die fraglichen Felder nicht genau identisch sind.Entfernen Sie doppelte Felder aus einer temporären Tabelle, die keinen Primärschlüssel enthält

Zum Beispiel habe ich die folgenden Daten:

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

Hier gibt es zwei John Johnson. Ich möchte nur einen John Johnson haben - mir ist es egal. So wird die resultierende Tabelle in etwa so aussehen:

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

ich TSQL bin, aber ich würde es vorziehen, SQL zu verwenden, die nicht-proprietär ist.

Dank

Antwort

1

Nun, ich bin spät zur Party, aber hier ist eine Datenbank, unabhängige Lösung:

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 mit einer Demo dafür. (Danke @JW für das Schema der Geige)

6

SQL Server unterstützt Common Table Expression und Window Functions. Mit dem Einsatz von ROW_NUMBER(), die für jede Gruppe Rangnummer liefert, können Sie Datensätze herauszufiltern, die Rang größer als eins (dies sind Duplikate ein)

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

Sie können CTE mit ROW_NUMBER() verwenden, um dies zu erreichen:

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

können Sie verwenden ein CTE mit ROW_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