2013-07-04 7 views
5

Mam obecnie tabelę o nazwie Ludzie. W tej tabeli są tysiące wierszy danych, które następują poniższy układ:Usuń 1 wystąpienie zduplikowanych wartości 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 

Gdybym wykonać następujące czynności:

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

mogę dostać zwrot:

Person_Id  | TotalCount 
ABC123456  | 2 

teraz Chciałbym usunąć tylko jeden wiersz zduplikowanych wartości, więc po wykonaniu powyższego zapytania nie zwracam żadnych wyników. czy to możliwe?

+0

nie widzę zduplikowane wartości Chcesz usunąć lub Leno Fred (kto ma ten sam Person_ID)? Czy istnieje zasada podejmowania takiej decyzji? –

Odpowiedz

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

Dzięki. Doceniam to – LaLa

0

Spróbuj

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

Można użyć MIN lub 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

Wykorzystanie Top kluczowe z kasowania;

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

)

Kwerenda jest taka sama jak wysłane przez Vassy z zaledwie Góra (1) addded ...

Powiązane problemy