Database
 sql >> Datenbank >  >> RDS >> Database

SCD-Typ 6

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