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 Variationen verwenden eine vollständige äußere Verknüpfung, um Datensätze aus der ursprünglichen Datenquelle mit Datensätzen in der aktualisierten Quelle abzugleichen, basierend auf der Gleichsetzung eines Schlüssels von beiden. Datensätze in der Aktualisierungsquelle, die keine Übereinstimmung aufweisen, müssen dem Master hinzugefügt werden.
Hier ist eine Übersicht darüber, wie eine Maßdatei oder Tabelle mit SCD Typ 6 aktualisiert wird, wobei ich die Produktkosten pflege. Die Aktualisierung erfolgt durch Verknüpfung bezüglich des Feldes ProductCode .
Typ 6 SCD
Typ 6 ist ein Hybrid, der eine Kombination aus Typ 1, Typ 2 und Typ 3 ist. Er wird Typ 6 genannt, weil 1+2+3=6. Jeder Datensatz wird die folgenden Felder haben:
- Produktcode : Dies ist das Kennungsschlüsselfeld.
- Kosten :Aktuelle Kosten des Produkts.
- HistorischeKosten :Kosten, die am Startdatum für diesen Datensatz wirksam wurden.
- Startdatum :Datum, an dem die HistoricalCost wirksam wurden.
- Enddatum :Datum, an dem die HistoricalCost für den Datensatz nicht mehr die aktuellen CurrentCost waren. Wenn die historischen Kosten immer noch die aktuellen Kosten sind, dann ist das Enddatum 99991231.
- Aktuell :Y, wenn die Kosten noch aktuell sind, N, wenn nicht
Sehen wir uns zunächst einmal die Datensätze für ProductCode an J245. Beginnen wir mit den frühesten HistoricalCost waren die aktuellen Kosten. Die HistoricalCost sind die gleichen wie die Cost. Es gibt dann einen Datensatz für den ProductCode J245 und er hat die unten gezeigten Werte:
ProductCode | Kosten | HistorischeKosten | Startdatum | Enddatum | Aktuell |
---|---|---|---|---|---|
J245 | 385,25 | 385,25 | 20100215 | 99991231 | J |
Wenn neue Kosten implementiert werden müssen, werden die Werte im Aktualisierungsdatensatz verwendet, um einen neuen aktuellen Datensatz hinzuzufügen. Die CurrentCost in allen Datensätzen mit dem Produktcode J245 wird in Kosten geändert Wert aus dem Aktualisierungsdatensatz, während HistoricalCost bleibt für die bestehenden Datensätze gleich. Außerdem das EndDate für den alten aktuellen Datensatz wird in StartDate geändert für den neuen aktuellen Rekord. In den Datensätzen mit ProductCode J245, die CurrentCost Das Feld in der aktualisierten Masterdatei hat jetzt die folgenden Werte:
ProductCode | Kosten | HistorischeKosten | Startdatum | Enddatum | Aktuell |
---|---|---|---|---|---|
J245 | 425,25 | 425,25 | 20101001 | 99991231 | J |
J245 | 425,25 | 385,25 | 20100215 | 20101001 | N |
Jetzt aktualisieren wir mit den nächsten neuen Kosten und erhalten die folgenden Werte für die J245-Einträge:
ProductCode | Kosten | HistorischeKosten | Startdatum | Enddatum | Aktuell |
---|---|---|---|---|---|
J245 | 450,50 | 450,50 | 20110430 | 99991231 | J |
J245 | 450,50 | 425,25 | 20101001 | 20110430 | N |
J245 | 450,50 | 385,25 | 20100215 | 20101001 | N |
Die letzte Aktualisierung erstellt Datensätze mit diesen Werten:
ProductCode | Kosten | HistorischeKosten | Startdatum | Enddatum | Aktuell |
---|---|---|---|---|---|
J245 | 550,50 | 550,50 | 20120701 | 99991231 | J |
J245 | 550,50 | 450,50 | 20110430 | 20120701 | N |
J245 | 550,50 | 425,25 | 20101001 | 20110430 | N |
J245 | 550,50 | 385,25 | 20100215 | 20101001 | N |
Hier sind die Werte in der Masterdatei vor der Aktualisierung:
ProductCode | Kosten | HistorischeKosten | Startdatum | Enddatum | Aktuell |
---|---|---|---|---|---|
C123 | 125,50 | 125,50 | 20110228 | 99991231 | J |
F112 | 2365,00 | 2365,00 | 20120101 | 99991231 | J |
G101 | 19.25 | 19.25 | 20110930 | 99991231 | J |
G101 | 19.25 | 21.25 | 20110501 | 20110930 | N |
J245 | 450,50 | 450,50 | 20110430 | 99991231 | J |
J245 | 450,50 | 425,25 | 20101001 | 20110430 | N |
J245 | 450,50 | 385,25 | 20100215 | 20101001 | N |
S022 | 98,75 | 98,75 | 20110515 | 99991231 | J |
Die Aktualisierungsdaten haben alle das gleiche StartDate . Die Quelle update.dat enthält die folgenden Werte:
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 6 ist das Ziel normalerweise die ursprüngliche Masterdatei 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 Feld wird master6.CurrentCost zugeordnet und das update.StartDate Feld wird master6.StartDate zugeordnet . Das Flaggenfeld ist das Feld, das verwendet wird, um zu bestimmen, ob der Datensatz die neuesten Feldwerte enthält. In diesem Fall ist dieses Feld master6.current . Wenn es sich um den aktuellsten Datensatz handelt, dann CurrentCost Feld und die HistoryCost Feld wird die gleichen Werte haben. Der Positive Flag-Wert ist der Wert in master6.Current die bestimmt, dass die Feldwerte die neuesten Werte für einen ProductCode sind . Wenn das der Fall ist, ist der Wert in unserem Beispiel „Y“ und der Negative Wert kennzeichnen ist „N“. Endfeld 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 aktuell ist.
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 in der Dropdown-Liste für Sortierungsoption auswählen unter der zu sortierenden Datenquelle.
Hier ist das erste Jobskript:
/INFILE=master6.dat /PROCESS=DELIMITED /ALIAS=master6 /FIELD=(PRODUCTCODE, TYPE=ASCII, POSITION=1, SEPARATOR=",", FRAME='\"') /FIELD=(CURRENTCOST, TYPE=NUMERIC, POSITION=2, SEPARATOR=",", FRAME='\"') /FIELD=(HISTORICALCOST, TYPE=NUMERIC, POSITION=3, SEPARATOR=",", FRAME='\"') /FIELD=(STARTDATE, TYPE=ASCII, POSITION=4, SEPARATOR=",", FRAME='\"') /FIELD=(ENDDATE, TYPE=ASCII, POSITION=5, SEPARATOR=",", FRAME='\"') /FIELD=(CURRENT, TYPE=ASCII, POSITION=6, SEPARATOR=",", FRAME='\"') /INFILE=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 NOT_SORTED master6 update WHERE MASTER6.PRODUCTCODE == UPDATE.PRODUCTCODE /OUTFILE=master6.dat # Make changes to records that have the same ProductCode # as records in the update file /PROCESS=DELIMITED /FIELD=(MASTER6.PRODUCTCODE, TYPE=ASCII, POSITION=1, SEPARATOR=",", FRAME='\"') /FIELD=(UPDATE.COST, TYPE=NUMERIC, POSITION=2, SEPARATOR=",", FRAME='\"') /FIELD=(MASTER6.HISTORICALCOST, TYPE=NUMERIC, POSITION=3, SEPARATOR=",", FRAME='\"') /FIELD=(MASTER6.STARTDATE, TYPE=ASCII, POSITION=4, SEPARATOR=",", FRAME='\"') /FIELD=(ENDDATE_NEW, TYPE=ASCII, POSITION=5, SEPARATOR=",", FRAME='\"', IF MASTER6.CURRENT EQ "Y" THEN UPDATE.STARTDATE ELSE MASTER6.ENDDATE) /FIELD=(CURRENT_NEW="N", TYPE=ASCII, POSITION=6, SEPARATOR=",", FRAME='\"') /INCLUDE WHERE MASTER6.PRODUCTCODE == UPDATE.PRODUCTCODE /OUTFILE=master6.dat # Keep the records that have no updates /PROCESS=DELIMITED /FIELD=(MASTER6.PRODUCTCODE, TYPE=ASCII, POSITION=1, SEPARATOR=",", FRAME='\"') /FIELD=(MASTER6.CURRENTCOST, TYPE=NUMERIC, POSITION=2, SEPARATOR=",", FRAME='\"') /FIELD=(MASTER6.HISTORICALCOST, TYPE=NUMERIC, POSITION=3, SEPARATOR=",", FRAME='\"') /FIELD=(MASTER6.STARTDATE, TYPE=ASCII, POSITION=4, SEPARATOR=",", FRAME='\"') /FIELD=(MASTER6.ENDDATE, TYPE=ASCII, POSITION=5, SEPARATOR=",", FRAME='\"') /FIELD=(MASTER6.CURRENT, TYPE=ASCII, POSITION=6, SEPARATOR=",", FRAME='\"') /OMIT WHERE MASTER6.PRODUCTCODE == UPDATE.PRODUCTCODE /OMIT WHERE MASTER6.PRODUCTCODE EQ "" /OUTFILE=master6.dat # Add the records with new product codes /PROCESS=DELIMITED /FIELD=(UPDATE.PRODUCTCODE, TYPE=ASCII, POSITION=1, SEPARATOR=",", FRAME='\"') /FIELD=(UPDATE.COST, TYPE=NUMERIC, POSITION=2, SEPARATOR=",", FRAME='\"') /FIELD=(UPDATE.COST, TYPE=NUMERIC, POSITION=3, SEPARATOR=",", FRAME='\"') /FIELD=(UPDATE.STARTDATE, TYPE=ASCII, POSITION=4, SEPARATOR=",", FRAME='\"') /FIELD=(ENDDATE_NEW="99991231", TYPE=ASCII, POSITION=5, SEPARATOR=",", FRAME='\"') /FIELD=(CURRENT_NEW="Y", TYPE=ASCII, POSITION=6, SEPARATOR=",", FRAME='\"') /OMIT WHERE UPDATE.PRODUCTCODE EQ "" /INCLUDE WHERE UPDATE.PRODUCTCODE
Zur Überprüfung,
- Der Wert für CurrentCost ist für alle Datensätze gleich, die einen gemeinsamen ProductCode haben
- Startdatum ist das Datum, an dem die HistoricalCost wirksam geworden
- Für den aktuellsten Datensatz eines Produktcodes
- die Werte für CurrentCost und HistorischeKosten sind gleich
- das Enddatum ist 99991231
- Der Wert in Aktuell ist Y
- Für die Datensätze, die nicht der aktuelle Datensatz sind
- Enddatum ist das Datum, an dem die nächsten neueren Kosten anfallen wirksam geworden
- Das Feld Aktuell hat N für den Wert
Die neue Masterdatei wird nicht sortiert, da die neuen aktuellen Masterdatensätze am Ende der Masterdatei hinzugefügt wurden, die Werte wie diese haben:
ProductCode | Kosten | HistorischeKosten | Startdatum | Enddatum | Aktuell |
---|---|---|---|---|---|
C123 | 125,50 | 125,50 | 20110228 | 99991231 | J |
F112 | 2425,00 | 2365,00 | 20120101 | 20120701 | N |
G101 | 19.25 | 19.25 | 20110930 | 99991231 | J |
G101 | 19.25 | 21.25 | 20110501 | 20110930 | N |
J245 | 550,50 | 450,50 | 20110430 | 20120701 | N |
J245 | 550,50 | 425,25 | 20101001 | 20110430 | N |
J245 | 550,50 | 385,25 | 20100215 | 20101001 | N |
S022 | 101,75 | 98,75 | 20110515 | 20120701 | N |
F112 | 2425,00 | 2425,00 | 20120701 | 99991231 | J |
J245 | 550,50 | 550,50 | 20120701 | 99991231 | J |
M447 | 139,25 | 139,25 | 20120701 | 99991231 | J |
S022 | 101,75 | 101,75 | 20120701 | 99991231 | J |