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
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
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.
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?
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
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)
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;
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