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-typen 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 varianten gebruiken een volledige outer join om records uit de oorspronkelijke hoofdgegevensbron te matchen met records in de bijgewerkte bron 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 3 waarbij ik de productkosten handhaaf. De update wordt bereikt door lid te worden met betrekking tot het veld ProductCode .
Type 3 SCD
Bij het Type 3 model worden de huidige data en de historische data in hetzelfde record ondergebracht. Een van de belangrijkste dingen om te beslissen is hoeveel geschiedenis moet worden bewaard. Met ons voorbeeld houd ik een kostprijs voor drie startdatums. Einddatum is de datum waarop de kosten in het record niet langer geldig zijn. Als de kosten nog steeds effectief zijn, dan is de EndDate1 veld wordt ingesteld op 99991231. Dit is om een lege waarde in dit veld te voorkomen. Dit zijn de waarden in de startmasterbron (master3.dat):
Productcode | Kosten1 | StartDatum1 | Einddatum1 | Kosten2 | StartDatum2 | Einddatum2 | Kosten3 | StartDatum3 | Einddatum3 |
---|---|---|---|---|---|---|---|---|---|
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 |
De updaterecords hebben allemaal dezelfde StartDate. De bron update.dat bevat de volgende veldwaarden voor de records:
Productcode | Kosten | Startdatum |
---|---|---|
F112 | 2425,00 | 20120701 |
J245 | 550,50 | 20120701 |
M447 | 101,75 | 20120701 |
S022 | 101,75 | 20120701 |
Hieronder vindt u de bijgewerkte gegevens. Voor elk record dat is bijgewerkt, wordt elke kostprijs, startdatum en einddatum één set naar rechts verplaatst. In de oude huidige groep voor de goede orde, wordt de einddatum gewijzigd in de startdatum voor de nieuwe bijgewerkte huidige set. Alle waarden voor de oude derde set worden weggegooid.
Productcode | Kosten1 | StartDatum1 | Einddatum1 | Kosten2 | StartDatum2 | Einddatum2 | Kosten3 | StartDatum3 | Einddatum3 |
---|---|---|---|---|---|---|---|---|---|
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 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 bestanden selecteert die worden gebruikt voor het verwerken van de update.
In de bovenste tabel op het volgende scherm bepaalt u hoe de gegevens die worden bijgewerkt, worden toegewezen aan de master. Kies in de middelste groepering op het scherm de velden die de statuswaarden geven voor de records die worden bijgewerkt.
In de vervolgkeuzelijsten onder Huidige en Historische veldensets , de eerste set die u definieert, geeft de veldnamen voor huidige waarden. Waardeveld is de dimensionale waarde die wordt bijgewerkt. Veld starten is het veld dat bepaalt wanneer het Value Field werd actief en End Field bepaalt wanneer het niet meer geldig is. Definieer vervolgens zoveel sets als u nodig heeft voor het aantal historische waarden dat wordt bewaard.
Hier is het taakscript dat het hoofdbestand zal bijwerken:
/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 ""