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

SCD-Typ 3

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 Stammdatenquelle mit Datensätzen in der aktualisierten Quelle 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 3 aktualisiert wird, wobei ich die Produktkosten pflege. Die Aktualisierung erfolgt durch Verknüpfung bezüglich des Felds ProductCode .

Typ 3 SCD

Beim Typ-3-Modell werden die aktuellen Daten und die historischen Daten in demselben Datensatz geführt. Eine der wichtigsten Entscheidungen ist, wie viel Historie aufbewahrt werden soll. In unserem Beispiel behalte ich die Kosten für drei Starttermine bei. Enddatum ist das Datum, an dem die Kosten im Datensatz nicht mehr gültig sind. Wenn die Kosten noch gültig sind, dann das EndDate1 wird auf 99991231 gesetzt. Dadurch soll ein leerer Wert in diesem Feld vermieden werden. Hier sind die Werte, die in der Start-Master-Quelle (master3.dat) enthalten sind:

ProductCode Kosten1 Startdatum1 EndDate1 Kosten2 Startdatum2 EndDate2 Kosten3 Startdatum3 EndDate3
C123 125,50 20110228 99991231
F112 2365,00 20120101 99991231
G101 19.25 20110930 99991231 21.25 20110501 20110930
J245 450,50 20110430 99991231 425,25 20101001 20110430 385,25 20100215 20101001
S022 98,75 20110515 99991231

Die Fortschreibungssätze haben alle das gleiche Startdatum. Die Quelle update.dat enthält die folgenden Feldwerte für die Datensätze:

ProductCode Kosten Startdatum
F112 2425,00 20120701
J245 550,50 20120701
M447 101,75 20120701
S022 101,75 20120701

Nachfolgend die aktualisierten Daten. Für jeden aktualisierten Datensatz werden alle Kosten, Startdaten und Enddaten um einen Satz nach rechts verschoben. In der alten aktuellen Gruppe für den Datensatz wird das Enddatum in das Startdatum für den neuen aktualisierten aktuellen Satz geändert. Alle Werte für den alten dritten Satz werden verworfen.

ProductCode Kosten1 Startdatum1 EndDate1 Kosten2 Startdatum2 EndDate2 Kosten3 Startdatum3 EndDate3
C123 125,50 20110228 9991231
F112 2425,00 20120701 9991231 2365,00 20120101 20120701
G101 19.25 20110930 9991231 21.25 20110501 20110930
J245 550,50 20120701 9991231 450,50 20110430 20120701 425,25 20101001 20110430
M447 101,75 20120701 9991231
S022 101,75 20120701 9991231 98,75 20110515 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 Dateien auswählen, die für die Verarbeitung des Updates verwendet werden.

In der oberen Tabelle auf dem nächsten Bildschirm legen Sie fest, wie die zu aktualisierenden Daten auf den Master abgebildet werden. Wählen Sie in der mittleren Gruppierung auf dem Bildschirm die Felder aus, die die Statuswerte für die Datensätze angeben, die aktualisiert werden.

In den Drop-down-Menüs unter Aktuell und Historische Feldsets , der erste Satz, den Sie definieren, gibt die Feldnamen für aktuelle Werte an. Wertfeld ist der Dimensionswert, der aktualisiert wird. Startfeld ist das Feld, das bestimmt, wann das Wertfeld ist wurde aktiv und End Field bestimmt, wann es nicht mehr gültig ist. Definieren Sie dann so viele Sätze, wie Sie für die Anzahl der aufzubewahrenden historischen Werte benötigen.

Hier ist das Jobskript, das die Masterdatei aktualisiert:

/INFILE=master3.dat
    /PROCESS=DELIMITED
    /ALIAS=master3
    /FIELD=(PRODUCTCODE, TYPE=ASCII, POSITION=1, SEPARATOR=",")
    /FIELD=(COST1, TYPE=NUMERIC, POSITION=2, SEPARATOR=",")
    /FIELD=(STARTDATE1, TYPE=ASCII, POSITION=3, SEPARATOR=",")
    /FIELD=(ENDDATE1, TYPE=ASCII, POSITION=4, SEPARATOR=",")
    /FIELD=(COST2, TYPE=NUMERIC, POSITION=5, SEPARATOR=",")
    /FIELD=(STARTDATE2, TYPE=ASCII, POSITION=6, SEPARATOR=",")
    /FIELD=(ENDDATE2, TYPE=ASCII, POSITION=7, SEPARATOR=",")
    /FIELD=(COST3, TYPE=NUMERIC, POSITION=8, SEPARATOR=",")
    /FIELD=(STARTDATE3, TYPE=ASCII, POSITION=9, SEPARATOR=",")
    /FIELD=(ENDATE3, TYPE=ASCII, POSITION=10, SEPARATOR=",")
/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 master3 update WHERE MASTER3.PRODUCTCODE == UPDATE.PRODUCTCODE

/OUTFILE=master3.dat
# Include only records that are to be updated
    /PROCESS=DELIMITED
    /FIELD=(UPDATE.PRODUCTCODE, TYPE=ASCII, POSITION=1, SEPARATOR=",")
    /FIELD=(UPDATE.COST, TYPE=NUMERIC, POSITION=2, SEPARATOR=",")
    /FIELD=(UPDATE.STARTDATE, TYPE=ASCII, POSITION=3, SEPARATOR=",")
    /FIELD=(ENDDATE1_NEW="99991231", TYPE=ASCII, POSITION=4, SEPARATOR=",")
    /FIELD=(MASTER3.COST1, TYPE=NUMERIC, POSITION=5, SEPARATOR=",")
    /FIELD=(MASTER3.STARTDATE1, TYPE=ASCII, POSITION=6, SEPARATOR=",")
    /FIELD=(UPDATE.STARTDATE, TYPE=ASCII, POSITION=7, SEPARATOR=",")
    /FIELD=(MASTER3.COST3, TYPE=NUMERIC, POSITION=8, SEPARATOR=",")
    /FIELD=(MASTER3.STARTDATE3, TYPE=ASCII, POSITION=9, SEPARATOR=",")
    /FIELD=(MASTER3.ENDATE3, TYPE=ASCII, POSITION=10, SEPARATOR=",")
    /INCLUDE WHERE MASTER3.PRODUCTCODE == UPDATE.PRODUCTCODE

/OUTFILE=master3.dat
# Include only records that are not to be updated
    /PROCESS=DELIMITED
    /FIELD=(MASTER3.PRODUCTCODE, TYPE=ASCII, POSITION=1, SEPARATOR=",")
    /FIELD=(MASTER3.COST1, TYPE=NUMERIC, POSITION=2, SEPARATOR=",")
    /FIELD=(MASTER3.STARTDATE1, TYPE=ASCII, POSITION=3, SEPARATOR=",")
    /FIELD=(MASTER3.ENDDATE1, TYPE=ASCII, POSITION=4, SEPARATOR=",")
    /FIELD=(MASTER3.COST2, TYPE=NUMERIC, POSITION=5, SEPARATOR=",")
    /FIELD=(MASTER3.STARTDATE2, TYPE=ASCII, POSITION=6, SEPARATOR=",")
    /FIELD=(MASTER3.ENDDATE2, TYPE=ASCII, POSITION=7, SEPARATOR=",")
    /FIELD=(MASTER3.COST3, TYPE=NUMERIC, POSITION=8, SEPARATOR=",")
    /FIELD=(MASTER3.STARTDATE3, TYPE=ASCII, POSITION=9, SEPARATOR=",")
    /FIELD=(MASTER3.ENDATE3, TYPE=ASCII, POSITION=10, SEPARATOR=",")
    /OMIT WHERE MASTER3.PRODUCTCODE == UPDATE.PRODUCTCODE
    /OMIT WHERE MASTER3.PRODUCTCODE EQ ""
/OUTFILE=C:/IRI/CoSort95/workbench.orig/workspace/SCD/SCD3/master3.dat
# Add new records
    /PROCESS=DELIMITED
    /FIELD=(UPDATE.PRODUCTCODE, TYPE=ASCII, POSITION=1, SEPARATOR=",")
    /FIELD=(UPDATE.COST, TYPE=NUMERIC, POSITION=2, SEPARATOR=",")
    /FIELD=(UPDATE.STARTDATE, TYPE=ASCII, POSITION=3, SEPARATOR=",")
    /FIELD=(ENDDATE1_NEW="99991231", TYPE=ASCII, POSITION=4, SEPARATOR=",")
    /INCLUDE WHERE MASTER3.PRODUCTCODE EQ "" AND UPDATE.PRODUCTCODE NE ""