2013-04-09 7 views
5

Devo rimuovere campi duplicati da una tabella temporanea in cui i campi in questione non sono esattamente identici.Rimuovere i campi duplicati da una tabella temporanea priva di chiave primaria

Per esempio, ho i seguenti dati:

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

qui, ci sono due John Johnson. Voglio solo avere un John Johnson - non mi interessa quale. Quindi la tabella risultante avrà un aspetto simile:

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

sto utilizzando TSQL, ma preferirei usare SQL che è non proprietario.

Grazie

risposta

1

bene, sono in ritardo alla festa, ma qui è una soluzione agnostica database:

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 con una demo per questo. (Grazie a @JW per lo schema del violino)

6

SQL Server supporta Common Table Expression e Window Functions. Con l'uso di ROW_NUMBER() che fornisce il numero rango per ogni gruppo, è possibile filtrare i record che si collocano è maggiore di uno (questo sono duplicati uno)

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

È possibile utilizzare CTE con ROW_NUMBER() per ottenere ciò:

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

è possibile utilizzare un CTE con 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

Problemi correlati