2013-04-09 12 views
5

Potrzebuję usunąć zduplikowane pola z tabeli tymczasowej, w której dane pola nie są identyczne.Usuń zduplikowane pola z tabeli tymczasowej, która nie ma klucza podstawowego.

Na przykład, mam następujące dane:

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

Tutaj istnieją dwa Johna Johnsona. Chcę tylko jednego Johna Johnsona - nie obchodzi mnie, który z nich. Tak otrzymaną tabela będzie wyglądać mniej więcej tak:

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

używam TSQL, ale wolałbym używać SQL, który jest niezastrzeżone.

Dzięki

Odpowiedz

1

Cóż, jestem późno do partii, ale tutaj jest to rozwiązanie agnostykiem bazy danych:

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 z wersją demonstracyjną. (Dzięki @JW za schemat skrzypiec)

6

SQL Server obsługuje Common Table Expression i Window Functions. Dzięki zastosowaniu ROW_NUMBER() który dostarcza wiele rangi dla każdej grupy można odfiltrować rekordy których ranga jest większa niż jeden (tego są duplikaty jeden)

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

Aby wykonać tę czynność, można użyć CTE z ROW_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

Można użyć CTE z 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

Powiązane problemy