In der Datenverwaltung ist die Deduplizierung eine klassische Aufgabe. Wenn man von "Duplikate entfernen" spricht, möchte man normalerweise eine einzige Zeile für jeden Schlüssel beibehalten und die Wiederholungen eliminieren. Das macht ein PROC SORT mit der Option NODUPKEY sehr gut.
Es gibt jedoch einen strengeren Fall: vollständig jede Datengruppe zu löschen, die Duplikate aufweist. Wenn eine Kennung mehrmals vorkommt, wird davon ausgegangen, dass die Daten "kontaminiert" oder mehrdeutig sind, und man möchte keine Spur dieser Datensätze behalten. Nur die wirklich eindeutigen Kennungen (die nur einmal in der Originaltabelle vorkommen) sollen überleben.
Nehmen wir das Beispiel einer Tabelle, die eine Kundenkennung (ID) und ein Jahr (Year) enthält. Eine Beobachtung wird durch die Kombination ID + Year definiert.
Eingabedaten:
| Obs | ID | Year | Var1 | Status |
| 1 | 1 | 1999 | 5 | Eindeutig (zu behalten) |
| 2 | 2 | 2000 | 10 | Duplikat |
| 3 | 2 | 2000 | 8 | Duplikat |
| 4 | 2 | 2000 | 6 | Duplikat |
| 5 | 3 | 2001 | 7 | Eindeutig (zu behalten) |
| 6 | 4 | 2002 | 12 | Duplikat |
| 7 | 4 | 2002 | 15 | Duplikat |
Das Ziel ist es, eine Tabelle zu erhalten, die nur die Beobachtungen 1 und 5 enthält. Die ID-Gruppen 2 und 4 müssen vollständig verschwinden.
Wenn Sie PROC SORT NODUPKEY verwenden, behält SAS© die erste Zeile jeder Gruppe (Zeile 2 und Zeile 6 würden bleiben), was hier nicht das gewünschte Ergebnis ist.
Die eleganteste und prägnanteste Methode, um diesen Vorgang durchzuführen, verwendet PROC SQL. Die Idee ist, die Daten nach dem Identifikationsschlüssel zu gruppieren, die Anzahl der Elemente in jeder Gruppe zu zählen und nur diejenigen zu filtern, deren Anzahl streng gleich 1 ist.
Der Code:
Wie funktioniert das?
GROUP BY id, year: SAS© gruppiert virtuell die Zeilen, die dasselbe ID/Jahr-Paar teilen.
HAVING count(*) = 1: Dies ist die Filterbedingung, die nach der Gruppierung angewendet wird.
Dieser Ansatz ist sehr effizient, da er mehrere Sortier- und Markierungsschritte (Flagging) in einem klassischen Data-Schritt vermeidet.
Für die Puristen des DATA-Schritts würde das gleiche Ergebnis eine "doppelte Lese"-Logik oder die Verwendung der automatischen Variablen first. und last. nach einer Sortierung erfordern, wobei überprüft wird, ob first.id gleich last.id ist (was bedeutet, dass es nur eine Zeile für diese ID gibt).