Eine der klassischen Herausforderungen im Datenmanagement ist es, zwei Tabellen nicht anhand einer strikten Gleichheit, sondern anhand eines relativen Zeitfensters abzugleichen.
Das typische Szenario ist folgendes: Sie haben eine Referenztabelle mit Daten von Schlüsselereignissen (z. B. Bilanzstichtag, Marketingkampagnen-Datum) und eine zweite Tabelle mit einem Transaktionsverlauf. Ziel ist es, für jedes Schlüsselereignis alle Transaktionen abzurufen, die in den vorherigen 12 Monaten stattgefunden haben.
Im Gegensatz zu einem klassischen Join (MERGE), der identische Schlüssel erfordert, benötigt dieses Problem einen Ungleichheits-Join.
Das Szenario
Betrachten wir zwei Datensätze zur Veranschaulichung des Problems:
Referenztabelle (HAVE_BASE) : Enthält Unternehmen und ihre Pivot-Daten. Beachten Sie, dass Unternehmen 'A' zweimal mit zwei verschiedenen Daten vorkommt.
Ereignistabelle (HAVE_EVENT) : Enthält den Verlauf der Finanzergebnisse (EPS) pro Unternehmen zu verschiedenen Daten.
Ziel ist es, die Zeilen aus der Tabelle EVENT zu extrahieren, bei denen das Datum zwischen [Referenzdatum - 12 Monate] und [Referenzdatum] liegt.
Datenvorbereitung
Da Daten oft als Zeichenfolgen (z. B. "199701") importiert werden, ist der erste kritische Schritt, sie in echte numerische SAS©-Daten umzuwandeln, um arithmetische Berechnungen zu ermöglichen.
Warum der DATA-Schritt (Merge) nicht geeignet ist?
Ein intuitiver Versuch wäre, den DATA-Schritt mit einer MERGE-Anweisung zu verwenden. Allerdings gleicht MERGE Zeilen sequenziell basierend auf einer strikten Gleichheit der BY-Variablen ab.
Wenn Sie versuchen, mit Bedingungen wie if date >= intnx('month', date_b, -12) zu filtern, wird dies in "Many-to-Many"-Fällen (mehrere Referenzdaten für dasselbe Unternehmen) oft fehlschlagen, da der SAS©-Lesezeiger nicht "zurückgehen" kann, um die historischen Zeilen für das zweite Referenzdatum erneut zu testen.
Die optimale Lösung: PROC SQL
Die SQL-Sprache ist perfekt für diesen Fall, da sie ein kartesisches Produkt auf dem Join-Schlüssel (company) generiert und dann die Ergebnisse nach dem Zeitfenster filtert. Dies ermöglicht es, dieselbe Ereigniszeile mit mehreren Referenzdaten zu verknüpfen, wenn sich die Fenster überlappen.
Der Code
Die Schlüsselfunktion hier ist INTNX, die es ermöglicht, ein Datum um eine bestimmte Anzahl von Intervallen (hier -12 Monate) zu verschieben.
Analyse der WHERE-Klausel
base.company = evt.company : Unverzichtbar. Ohne dies würden Sie die Daten von Unternehmen A mit denen von Unternehmen B vergleichen.
intnx('month', base.date, -12) : Berechnet die untere Grenze des Fensters (das Datum, das genau 12 Monate vor dem Referenzdatum liegt).
Der Operator <= : Die Einschließung Untere_Grenze <= Ereignis_Datum <= Obere_Grenze ist die effizienteste und lesbarste Methode zur Definition des Intervalls.
Ergebnis und Interpretation
Wenn Unternehmen 'A' ein Referenzdatum im Januar 1997 und ein weiteres im Juni 1996 hat:
SQL verarbeitet zuerst Januar 1997 : Es sucht alle Ereignisse von 'A' zwischen Jan 96 und Jan 97.
Danach verarbeitet es Juni 1996 : Es sucht alle Ereignisse von 'A' zwischen Juni 95 und Juni 96.
Wenn ein Ereignis im Mai 1996 stattfindet, erscheint es zweimal im Endergebnis (einmal verbunden mit der Referenz von 97, einmal mit der von 96), was das korrekte erwartete Verhalten für eine Analyse dieser Art ist.
Um Daten über Zeitintervalle (gleitende Fenster) abzugleichen:
Bevorzugen Sie PROC SQL gegenüber dem DATA-Schritt.
Stellen Sie sicher, dass Ihre Daten im numerischen Format vorliegen.
Verwenden Sie INTNX, um die Grenzen Ihres Zeitfensters in der WHERE-Klausel dynamisch zu berechnen.