SQL Server 2008: Usuń zduplikowane wiersze

Mam zduplikowane wiersze w tabeli, Jak mogę je usunąć na podstawie wartości pojedynczej kolumny?

Eg

uniqueid, col2, col3 ...
1, john, simpson
2, sally, roberts
1, johnny, simpson

delete any duplicate uniqueIds
to get 

1, John, Simpson
2, Sally, Roberts
Author: marc_s, 2013-08-15

6 answers

Możesz DELETE z cte:

WITH cte AS (SELECT *,ROW_NUMBER() OVER(PARTITION BY uniqueid ORDER BY col2)'RowRank'
             FROM Table)
DELETE FROM cte 
WHERE RowRank > 1

Funkcja ROW_NUMBER() przypisuje liczbę do każdego wiersza. PARTITION BY jest używany do rozpoczynania numeracji dla każdego elementu w tej grupie, w tym przypadku każda wartość uniqueid rozpocznie numerowanie od 1 i stamtąd pójdzie w górę. ORDER BY określa, w jakiej kolejności idą liczby. Ponieważ każdy uniqueid jest numerowany od 1, każdy rekord z ROW_NUMBER() większym niż 1 ma duplikat uniqueid

Aby zrozumieć, jak działa funkcja ROW_NUMBER(), po prostu spróbuj out:

SELECT *,ROW_NUMBER() OVER(PARTITION BY uniqueid ORDER BY col2)'RowRank'
FROM Table
ORDER BY uniqueid

Możesz dostosować logikę funkcji ROW_NUMBER(), aby dostosować, który rekord chcesz zachować lub usunąć.

Na przykład, być może chciałbyś to zrobić w kilku krokach, najpierw usuwając rekordy o tym samym nazwisku, ale różnych imionach, możesz dodać nazwisko do PARTITION BY:

WITH cte AS (SELECT *,ROW_NUMBER() OVER(PARTITION BY uniqueid, col3 ORDER BY col2)'RowRank'
             FROM Table)
DELETE FROM cte 
WHERE RowRank > 1
 33
Author: Hart CO,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-08-15 16:42:15

Prawdopodobnie masz identyfikator wiersza, który jest przypisany przez DB podczas wstawiania i jest w rzeczywistości unikalny. Nazwę to rowId w moim przykładzie.

rowId |uniqueid |col2  |col3
----- |-------- |----  |----
1      10        john   simpson
2      20        sally  roberts
3      10        johnny simpson

Możesz usunąć duplikaty grupując na rzeczy, które mają być unikalne (czy to jedna kolumna, czy wiele), następnie pobierasz rowId z każdej grupy i usuwasz Wszystko inne poza tymi rowid. W zapytaniu wewnętrznym wszystko w tabeli będzie miało identyfikator rowId, z wyjątkiem zduplikowanych wierszy.

select * 
--DELETE 
FROM MyTable 
WHERE rowId NOT IN 
(SELECT MIN(rowId) 
 FROM MyTable 
 GROUP BY uniqueid);

Możesz również użyć MAX zamiast MIN z podobnymi wynikami.

 2
Author: CowboyBebop,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-11-26 06:07:13

DELETE FROM table WHERE uniqueid='1' AND col2='john' Albo zmieniasz col2='john' na col2='johnny'. Zależy od tego, który rekord chcesz usunąć.

Jak to się stało, że masz dwa takie same "unikalne" identyfikatory?

 1
Author: waka,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-08-15 15:40:22
DECLARE @du TABLE (
    id INT,  
    Name VARCHAR(4)
)

INSERT INTO @du VALUES(1,'john')
INSERT INTO @du VALUES(2,'jane')
INSERT INTO @du VALUES(1,'john')

;WITH dup (id,dp)
AS
(SELECT id
, ROW_NUMBER() OVER(PARTITION BY id ORDER BY Name) AS dp
FROM @du)
DELETE FROM dup
WHERE dp > 1

SELECT *
FROM @du
 1
Author: user123,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-08-15 15:48:01

Masz wiele sposobów na usunięcie zduplikowanych rekordów niektóre z nich są poniżej...........

Różne sposoby usuwania zduplikowanych rekordów

Using Row_Number () function and CTE

  with CTE(DuplicateCount) as  ( SELECT  ROW_NUMBER() OVER
(PARTITION by UniqueId order by UniqueId ) as DuplicateCount from
Table1 ) Delete from CTE where DuplicateCount > 1

  .Without using CTE*

Delete DuplicateCount from ( Select Row_Number() over(Partition by
UniqueId order by UniqueId) as Dup from Table1 ) DuplicateCount 
where DuplicateCount.Dup > 1

 .Without using row_Number() and CTE

Delete from Subject where RowId not in(select Min(RowId ) from
Subject group by UniqueId)
 1
Author: Ganesh Kumar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-12-24 18:25:32

Oto prosta magia do usuwania duplikatów

select * into NewTable from ExistingTable
union
select * from ExistingTable;
 1
Author: Ata Ul Wadood Bhatti,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-07-08 11:17:50