2013-07-04 20 views
5

私は現在Peopleというテーブルを持っています。私は、次のコマンドを実行した場合重複した値のインスタンスを1つ削除する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 

:今

Person_Id  | TotalCount 
ABC123456  | 2 

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

私はのリターンを得る、この表の中で、以下のレイアウトに従ったデータの行数千のがあります重複した値の行を1行だけ削除したいので、上記のクエリを実行すると結果は返されません。これは可能ですか?

+0

あなたはフレッドやレノを削除したい私は(、重複する値を見ることはできません誰が同じPerson_IDを持っていますか?)そのような決定を下すための規則はありますか? –

答えて

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

ありがとうございます。感謝します – LaLa

0

あなたはMINまたは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

削除とトップのキーワードの使用のいずれかを使用することができ、この

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

をお試しください。

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

ちょうどトップでバシーで掲載されたクエリが同じである(1)addded ...

関連する問題