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

SCD-Typ 2

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