SAS9

Datenabgleich über ein gleitendes Zeitfenster

Simon 6 Aufrufe

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:

  1. Referenztabelle (HAVE_BASE) : Enthält Unternehmen und ihre Pivot-Daten. Beachten Sie, dass Unternehmen 'A' zweimal mit zwei verschiedenen Daten vorkommt.

  2. 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.

1DATA have_base;
2 INPUT company $ _date :$6. profit;
3 /* Conversion de 'YYYYMM' en date SAS (1er du mois) */
4 date = INPUT(_date !! '01', yymmdd8.);
5 FORMAT date monyy6.;
6 drop _date;
7 DATALINES;
8a 199701 5
9a 199606 9
10b 201404 6
11f 200004 78
12;
13RUN;
14 
15/* Même traitement pour la table historique */
16DATA have_event;
17 INPUT company $ _date :$6. EPS;
18 date = INPUT(_date !! '01', yymmdd8.);
19 FORMAT date monyy6.;
20 drop _date;
21 /* ... données ... */
22RUN;

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.

1PROC SQL;
2 create TABLE want as
3 select
4 base.company,
5 base.profit,
6 base.date as Date_Reference,
7 evt.EPS,
8 evt.date as Date_Evenement
9 from
10 have_base as base,
11 have_event as evt
12 where
13 /* 1. Jointure sur l'identifiant */
14 base.company = evt.company
15 AND
16 /* 2. Jointure sur la fenêtre temporelle :
17 La date de l'événement doit être entre (Date Ref - 12 mois) et (Date Ref) */
18 intnx('month', base.date, -12) <= evt.date <= base.date;
19QUIT;

Analyse der WHERE-Klausel

  1. base.company = evt.company : Unverzichtbar. Ohne dies würden Sie die Daten von Unternehmen A mit denen von Unternehmen B vergleichen.

  2. intnx('month', base.date, -12) : Berechnet die untere Grenze des Fensters (das Datum, das genau 12 Monate vor dem Referenzdatum liegt).

  3. 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.