2013-07-04 17 views
5

Attualmente ho una tabella denominata Persone. All'interno di questo tavolo ci sono migliaia di righe di dati che seguono il layout di seguito:Rimuovere 1 istanza di valori duplicati T-SQL

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 

Se eseguo il seguente:

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

ricevo un ritorno di:

Person_Id  | TotalCount 
ABC123456  | 2 

Ora Vorrei rimuovere solo una riga dei valori duplicati così quando eseguo la query sopra non restituisco alcun risultato. È possibile?

+0

non riesco a vedere valore duplicato, Vuoi rimuovere Fred o Leno (chi ha lo stesso Person_ID)? C'è una regola per prendere tale decisione? –

risposta

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

Grazie. Apprezzalo – LaLa

0

Prova questa

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

È possibile utilizzare sia MIN o 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

Usa Top parola chiave con delete;

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

)

La query è stessa inviato da Vassy con appena superiore (1) addded ...

Problemi correlati