Proste usunięcie duplikatów

Dzisiaj prezentacja prostego sposobu na pozbycie się wszystkich rekordów, które nie są takie same ale niestety mają ten sam klucz.

Do wykonania takiej operacji posłużymy się oczywiście grupowaniem, ale nie tym klasycznym które wszyscy znamy (GROUP BY), a partycjonowaniem danych przy użyciu funkcji okienkowych (PARTITION BY)
Wystarczy ponumerowac rekordy (ROW_NUMBER()) względem zadanej partycji sortując tak by zostały tylko te rekordy, które są dla nas ważne.
Warto również zapamiętac, że tabela użyta w CTE (common table expression, to cos zaczynające się od WITH) może byc przez to CTE modyfikowana! Łącznie z usunięciem 🙂

Do roboty.

Naszym zadaniem jest usunąc wszystkie NAJSTARSZE duplikaty klucza (pole Nazwa)  zostawiając jedynie najświeższy rekord (decyduje o tym pole DataDodania)
Tworzymy tabelkę i dodajemy dane.

 

Zaczynamy numerować wiersze. Zobaczcie jak wygląda numerowanie z użyciem partycji i sortowaniem malejącym:

 

SQL ponumerował nam każdy wiersz nadając jedynkę każdej partycji (grupie wierszy po kolumnie Nazwa). Pozostałe rekordy będą oczywiście numerowane 1+n aż do wystąpienia nowej wartości partycjonowanej.
Dlatego możemy wykonać na powyższym CTE operację usunięcia rekordów, których NumerWiersza będzie większy od jedynki!

 

Voilà!

Cały skrypt poniżej:

 

POST PIERWOTNIE OPUBLIKOWANY JAKO TSQL NA DZIŚ #30

Dodaj komentarz