Dimensionsdaten, die sich langsam oder unvorhersehbar ändern, werden in SCD-Analysen (Slowly Changing Dimensions) erfasst. In einer Data-Warehouse-Umgebung hat eine Dimensionstabelle einen Primärschlüssel, der jeden Datensatz und andere Informationen, die als Dimensionsdaten bezeichnet werden, eindeutig identifiziert.
Alle Aktualisierungsmethoden für die verschiedenen SCD-Typen können mit dem SortCL-Programm in IRI CoSort durchgeführt werden. In IRI Voracity gibt es einen Assistenten, der beim Erstellen der SCD-Job-Skripte hilft, die beim Ausführen des SortCL-Programms verwendet werden. Die meisten SCD-Typen verwenden eine vollständige äußere Verknüpfung, um Datensätze aus der ursprünglichen Datenquelle mit Datensätzen in der Aktualisierungsquelle abzugleichen, basierend auf der Gleichsetzung eines Schlüssels von beiden. Datensätze mit Übereinstimmungen müssen im Master aktualisiert werden. Datensätze in der Aktualisierungsquelle, die keine Übereinstimmung aufweisen, müssen dem Master hinzugefügt werden.
Hier ist eine Übersicht darüber, wie eine Dimensionsdatei mit SCD Typ 2 aktualisiert wird, wobei ich die Produktkosten pflege. Die Aktualisierung erfolgt durch Verknüpfung bezüglich des Feldes ProductCode .
Typ 2 SCD
Bei diesem Modell werden die aktuellen und die historischen Aufzeichnungen in derselben Datei aufbewahrt. In einer aktiven Datenbank hätten Sie wahrscheinlich zusätzlich zum ProductCode einen Ersatzschlüssel, den Sie als Primärschlüssel für die Verknüpfung mit den Faktentabellen verwenden könnten Schlüssel, der für den Aktualisierungsvorgang verwendet wird. Da die aktuellen Datensätze und die historischen Datensätze in derselben Datei enthalten sind, muss ein Feld vorhanden sein, das angibt, ob der Datensatz der aktuelle Datensatz für den ProductCode ist und wir brauchen ein Feld, um anzugeben, wann die Kosten für den ProductCode anfallen ist nicht mehr wirksam. In diesem Beispiel haben wir:
- Produktcode :Dies ist das Identifikator-Schlüsselfeld.
- Kosten :Kosten, die am StartDate wirksam wurden fürs Protokoll.
- Startdatum :Dies ist das Datum, an dem die Kosten für die Aufzeichnung wirksam wurden.
- Enddatum :Dies ist das Datum, an dem die Kosten im Protokoll ist nicht mehr wirksam. Wenn die Kosten noch gültig sind, wird EndDate auf 99991231 gesetzt. Dadurch soll ein Nullwert in diesem Feld vermieden werden.
- Aktuell :Y, wenn die Kosten noch in Kraft sind, N, wenn nicht.
Die Starttabelle hat bereits 3 Historienrekorde. Das sind diejenigen, die den Wert N für das Feld Current haben . Die Masterquelle heißt master2.dat und enthält die folgenden Daten:
ProductCode | Kosten | Startdatum | Enddatum | Aktuell |
---|---|---|---|---|
C123 | 125,50 | 20110228 | 99991231 | J |
F112 | 2365,00 | 20120101 | 99991231 | J |
G101 | 19.25 | 20110930 | 99991231 | J |
G101 | 21.25 | 20110501 | 20110930 | N |
J245 | 450,50 | 20110430 | 99991231 | J |
J245 | 425,25 | 20101001 | 20110430 | N |
J245 | 385,25 | 20100215 | 20101001 | N |
S022 | 98,75 | 20110515 | 99991231 | J |
Die Fortschreibungssätze haben alle das gleiche StartDate . Die Quelle update.dat enthält Datensätze mit den folgenden Feldwerten:
ProductCode | Kosten | Startdatum |
---|---|---|
F112 | 2425,00 | 20120701 |
J245 | 550,50 | 20120701 |
M447 | 101,75 | 20120701 |
S022 | 101,75 | 20120701 |
In IRI Workbench gibt es einen Voracity-Assistenten, der bei der Erstellung von Skripten zum Aktualisieren von Dimensional-Dateien und -Tabellen hilft. Dieser Assistent befindet sich im Dropdown-Menü „Voracity“ in der Navigationsleiste. Wählen Sie zuerst den SCD-Typ aus. Anschließend wird das Fenster angezeigt, in dem Sie die Quellen auswählen, die für die Verarbeitung des Updates verwendet werden. Bei Typ 2 ist das Ziel normalerweise die ursprüngliche Master-Datei oder -Tabelle.
Mit dem nächsten Bild legen Sie fest, wie die Fortschreibungsdaten abgebildet werden und wie andere Feld- oder Spaltenwerte gesetzt werden. Die update.Cost wird der Master2.cost zugeordnet und die Aktualisierung. Startdatum wird dem master2.StartDate zugeordnet . Das Flaggenfeld ist das Feld, das verwendet wird, um den Datensatz mit den aktiven Kosten zu bestimmen. Das heißt, ob die Werte im Datensatz aktiv oder historisch sind. In diesem Fall das Flag Field ist das Feld Aktuell . Der Positive Flag-Wert ist der Wert in Current das bestimmt, ob die Kosten sind die aktuellen Kosten; der Wert ist in unserem Beispiel „Y“ und der Flag Negative Value ist „N“. End Field enthält den Namen des Felds, das den Wert enthält, der verwendet wird, um zu bestimmen, wann die Kosten für den Datensatz nicht mehr gültig sind, und Master.EndDate hält diesen Wert. Endwert wird als Wert für End Field verwendet wenn der Datensatz die aktuellen Werte für einen ProductCode enthält .
Der nächste Bildschirm dient zum Definieren des Joins, der mit den Master- und Update-Quellen durchgeführt wird. Beachten Sie, dass beide Quellen in Bezug auf ProductCode bestellt werden müssen . Wenn dies nicht der Fall ist, müssen Sie NOT_SORTED auswählen in der Dropdown-Liste für Sortierungsoption unter der zu sortierenden Datenquelle.
Hier ist das Jobskript:
/INFILE=C:/IRI/CoSort95/workbench.orig/workspace/SCD/SCD2/master2.dat /PROCESS=DELIMITED /ALIAS=master2 /FIELD=(PRODUCTCODE, TYPE=ASCII, POSITION=1, SEPARATOR=",", FRAME='\"') /FIELD=(COST, TYPE=NUMERIC, POSITION=2, SEPARATOR=",", FRAME='\"') /FIELD=(STARTDATE, TYPE=ASCII, POSITION=3, SEPARATOR=",", FRAME='\"') /FIELD=(ENDDATE, TYPE=ASCII, POSITION=4, SEPARATOR=",", FRAME='\"') /FIELD=(CURRENT, TYPE=ASCII, POSITION=5, SEPARATOR=",", FRAME='\"') /INFILE=C:/IRI/CoSort95/workbench.orig/workspace/SCD/update.dat /PROCESS=DELIMITED /ALIAS=update /FIELD=(PRODUCTCODE, TYPE=ASCII, POSITION=1, SEPARATOR=",", FRAME='\"') /FIELD=(COST, TYPE=ASCII, POSITION=2, SEPARATOR=",", FRAME='\"') /FIELD=(STARTDATE, TYPE=ASCII, POSITION=3, SEPARATOR=",", FRAME='\"') /JOIN FULL_OUTER master2 update WHERE MASTER2.PRODUCTCODE == UPDATE.PRODUCTCODE /OUTFILE=master2.dat # Include only records that are being updated # Use the Cost and StartDate from the Update file /PROCESS=DELIMITED /FIELD=(MASTER2.PRODUCTCODE, TYPE=ASCII, POSITION=1, SEPARATOR=",", FRAME='\"') /FIELD=(UPDATE.COST, TYPE=NUMERIC, POSITION=2, SEPARATOR=",", FRAME='\"') /FIELD=(UPDATE.STARTDATE, TYPE=ASCII, POSITION=3, SEPARATOR=",", FRAME='\"') /FIELD=(MASTER2.ENDDATE, TYPE=ASCII, POSITION=4, SEPARATOR=",", FRAME='\"') /FIELD=(MASTER2.CURRENT, TYPE=ASCII, POSITION=5, SEPARATOR=",", FRAME='\"') /INCLUDE WHERE MASTER2.PRODUCTCODE == UPDATE.PRODUCTCODE AND MASTER2.CURRENT EQ “Y" /OUTFILE=master2.dat # Change any current records that are being updated to history records # by giving the EndDate as the StartDate from the update record # and changing the field Current to N /PROCESS=DELIMITED /CONDITION=(MATCH, TEST=(MASTER2.PRODUCTCODE == UPDATE.PRODUCTCODE AND MASTER2.CURRENT EQ "Y")) /FIELD=(MASTER2.PRODUCTCODE, TYPE=ASCII, POSITION=1, SEPARATOR=",", FRAME='\"') /FIELD=(MASTER2.COST, TYPE=NUMERIC, POSITION=2, SEPARATOR=",", FRAME='\"') /FIELD=(MASTER2.STARTDATE, TYPE=ASCII, POSITION=3, SEPARATOR=",", FRAME='\"') /FIELD=(ENDDATE_NEW, TYPE=ASCII, POSITION=4, SEPARATOR=",", FRAME='\"', IF MATCH THEN UPDATE.STARTDATE ELSE MASTER2.ENDDATE) /FIELD=(CURRENT_NEW, TYPE=ASCII, POSITION=5, SEPARATOR=",", FRAME='\"', IF MATCH THEN "N" ELSE MASTER2.CURRENT) /OMIT WHERE MASTER2.PRODUCTCODE EQ "" /OUTFILE=master2.dat # Add new records /PROCESS=DELIMITED /FIELD=(PRODUCTCODE, TYPE=ASCII, POSITION=1, SEPARATOR=",", FRAME='\"') /FIELD=(UPDATE.COST, TYPE=NUMERIC, POSITION=2, SEPARATOR=",", FRAME='\"') /FIELD=(UPDATE.STARTDATE, TYPE=ASCII, POSITION=3, SEPARATOR=",", FRAME='\"') /FIELD=(ENDDATE_NEW="99991231", TYPE=ASCII, POSITION=4, SEPARATOR=",", FRAME='\"') /FIELD=(CURRENT_NEW="Y", TYPE=ASCII, POSITION=5, SEPARATOR=",", FRAME='\"') /INCLUDE WHERE UPDATE.PRODUCTCODE NE "" AND MASTER2.PRODUCTCODE EQ ""
Die neue Masterdatei wird diese Werte haben:
ProductCode | Kosten | Startdatum | Enddatum | Aktuell |
---|---|---|---|---|
C123 | 125,50 | 20110228 | 99991231 | J |
F112 | 2425,00 | 20120701 | 99991231 | J |
F112 | 2365,00 | 20120101 | 20120701 | N |
G101 | 19.25 | 20110930 | 99991231 | J |
G101 | 21.25 | 20110501 | 20110930 | N |
J245 | 550,50 | 20120701 | 99991231 | J |
J245 | 450,50 | 20110430 | 20120701 | N |
J245 | 425,25 | 20101001 | 20110430 | N |
J245 | 385,25 | 20100215 | 20101001 | N |
M447 | 101,75 | 20120701 | 99991231 | J |
S022 | 101,75 | 20120701 | 99991231 | J |
S022 | 98,75 | 20110515 | 20120701 | N |