2013-07-04 8 views
5

Ich habe derzeit eine Tabelle namens People. In dieser Tabelle gibt es Tausende von Datenzeilen, die die unten Layout folgen:Entfernen Sie 1 Instanz von doppelten Werten T-SQL

SELECT [PERSON_ID], COUNT(*) TotalCount 
FROM [Database].[dbo].[People] 
GROUP BY [PERSON_ID] 
HAVING COUNT(*) > 1 
ORDER BY COUNT(*) DESC 

ich eine Rendite von:

Person_Id  | TotalCount 
ABC123456  | 2 

Jetzt

gkey | Name | Date  | Person_Id 
1 | Fred | 12/05/2012 | ABC123456 
2 | John | 12/05/2012 | DEF123456 
3 | Dave | 12/05/2012 | GHI123456 
4 | Fred | 12/05/2012 | JKL123456 
5 | Leno | 12/05/2012 | ABC123456 

Wenn ich folgendes ausführen Ich möchte nur eine Zeile der doppelten Werte entfernen, also gebe ich keine Ergebnisse zurück, wenn ich die obige Abfrage ausführe. Ist das möglich?

+0

ich keine doppelten Wert sehen, würden Sie Fred oder Leno entfernen möchten (Wer hat die gleiche Person_ID)? Gibt es eine Regel für eine solche Entscheidung? –

Antwort

7
WITH a as 
(
SELECT row_number() over (partition by [PERSON_ID] order by name) rn 
FROM [Database].[dbo].[People] 
) 
DELETE FROM a 
WHERE rn = 2 
+0

Danke. Bin dankbar – LaLa

0

Versuchen Sie, diese

DELETE FROM [People] 
WHERE gkey IN 
(
    SELECT MIN(gkey) 
    FROM [People] 
    GROUP BY [PERSON_ID] 
    HAVING COUNT(*) > 1 
) 

Sie können entweder MIN oder Max

0
DELETE FROM PEOPLE WHERE gkey= 
(SELECT MAX(TABLE1.gkey) FROM (SELECT P.gkey, A.PERSON_ID,A.TotalCount FROM People P,(SELECT [PERSON_ID], COUNT(*) TotalCount 
FROM [Database].[dbo].[People] 
GROUP BY [PERSON_ID] 
HAVING COUNT(*) > 1 
ORDER BY COUNT(*) DESC) A WHERE P.gkey=A.gkey) TABLE1) TABLE2 
0

Verwenden Top Stichwort mit löschen;

DELETE TOP(1) FROM [People] 
WHERE Person_Id IN 
(
    SELECT MIN([PERSON_ID]) 
    FROM [People] 
    GROUP BY [PERSON_ID] 
    HAVING COUNT(*) > 1 

)

Die Abfrage ist die gleiche wie von Vassy geschrieben mit nur Top (1) added ...

Verwandte Themen