Dimensionale gegevens die langzaam of onvoorspelbaar veranderen, worden vastgelegd in Slowly Changing Dimensions (SCD)-analyses. In een datawarehouse-omgeving heeft een dimensietabel een primaire sleutel die elk record en andere stukjes informatie die bekend staan als de dimensionale gegevens op unieke wijze identificeert.
Alle updatemethoden voor de verschillende SCD-types kunnen worden uitgevoerd met behulp van het SortCL-programma in IRI CoSort. In IRI Voracity is er een wizard die helpt bij het maken van de SCD-taakscripts die worden gebruikt bij het uitvoeren van het SortCL-programma. De meeste SCD-typen gebruiken een volledige outer join om records uit de oorspronkelijke gegevensbron te matchen met records in de updatebron op basis van het gelijkstellen van een sleutel van elk. Records met overeenkomsten moeten worden bijgewerkt in de master. Records in de updatebron die geen overeenkomst hebben, moeten aan de master worden toegevoegd.
Hier is een overzicht van hoe u een dimensionaal bestand bijwerkt met SCD Type 2 waarbij ik de productkosten handhaaf. De update wordt bereikt door lid te worden met betrekking tot veld ProductCode .
Type 2 SCD
In dit model worden de huidige en de historische gegevens in hetzelfde bestand bewaard. In een actieve database zou u naast de ProductCode waarschijnlijk een surrogaatsleutel hebben die u kunt gebruiken als primaire sleutel voor koppelingen naar de feitentabellen. sleutel die wordt gebruikt voor het updateproces. Omdat de huidige records en de historische records zich in hetzelfde bestand bevinden, is het noodzakelijk om een veld te hebben dat aangeeft of het record het huidige record is voor de ProductCode en we hebben een veld nodig om aan te geven wanneer de kosten voor de ProductCode is niet meer effectief. In dit voorbeeld hebben we:
- Productcode :Dit is het identificatiesleutelveld.
- Kosten :kosten die van kracht werden op de StartDate voor de goede orde.
- Startdatum :dit is de datum waarop de kosten voor het record van kracht zijn geworden.
- Einddatum :Dit is de datum waarop de Kosten in het dossier is niet langer effectief. Als de Kosten nog steeds geldig zijn, wordt de Einddatum ingesteld op 99991231. Dit is om een null-waarde in dit veld te voorkomen.
- Huidige :Y als de kosten nog steeds van kracht zijn, N als dat niet het geval is.
De starttafel heeft al 3 historierecords. Dit zijn degenen die de waarde N hebben voor het veld Huidige . De masterbron heet master2.dat en bevat de onderstaande gegevens:
Productcode | Kosten | Startdatum | Einddatum | Huidige |
---|---|---|---|---|
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 |
De updaterecords hebben allemaal dezelfde StartDate . De bron update.dat bevat records met de volgende veldwaarden:
Productcode | Kosten | Startdatum |
---|---|---|
F112 | 2425,00 | 20120701 |
J245 | 550,50 | 20120701 |
M447 | 101,75 | 20120701 |
S022 | 101,75 | 20120701 |
In IRI Workbench is er een Voracity-wizard die helpt bij het maken van scripts voor het bijwerken van dimensionale bestanden en tabellen. Deze wizard bevindt zich in de vervolgkeuzelijst Vraatzucht op de navigatiebalk. Kies eerst het SCD-type. Vervolgens wordt het venster weergegeven waarin u de bronnen selecteert die worden gebruikt voor het verwerken van de update. Voor Type 2 is het doel normaal gesproken het originele hoofdbestand of de oorspronkelijke tabel.
Met het volgende scherm bepaalt u hoe de updategegevens worden toegewezen en hoe andere veld- of kolomwaarden worden ingesteld. De update.Cost wordt toegewezen aan de Master2.cost en de update. Startdatum wordt toegewezen aan de master2.StartDate . Het Vlagveld is het veld dat wordt gebruikt om het record met de actieve kosten te bepalen. Dat wil zeggen, of de waarden in de record actief of historisch zijn. In dit geval is het Vlagveld is het veld Huidige . De Positieve waarde markeren is de waarde in Huidige die bepaalt of de Kosten is de huidige Kosten; de waarde is "Y" in ons voorbeeld en de Negatieve waarde markeren is "N". End Field bevat de naam van het veld dat de waarde bevat die wordt gebruikt om te bepalen wanneer de kosten voor het record niet langer van kracht zijn en Master.EndDate houdt die waarde vast. Eindwaarde wordt gebruikt als de waarde voor End Field wanneer het record de huidige waarden bevat voor een ProductCode .
Het volgende scherm is voor het definiëren van de join die wordt uitgevoerd met de master- en updatebronnen. Houd er rekening mee dat beide bronnen moeten worden besteld met betrekking tot ProductCode . Als dat niet het geval is, moet u NOT_SORTED . selecteren in de vervolgkeuzelijst voor Ordersorteeroptie onder de gegevensbron die moet worden gesorteerd.
Hier is het jobscript:
/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 ""
Het nieuwe hoofdbestand heeft deze waarden:
Productcode | Kosten | Startdatum | Einddatum | Huidige |
---|---|---|---|---|
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 |