Dimensionsdata som förändras långsamt eller oförutsägbart fångas i Slowly Changing Dimensions-analyser (SCD). I en datalagermiljö har en dimensionstabell en primärnyckel som unikt identifierar varje post och annan information som kallas dimensionsdata.
Alla uppdateringsmetoder för de olika SCD-typerna kan utföras med programmet SortCL i IRI CoSort. I IRI Voracity finns det en guide som hjälper dig att skapa SCD-jobbskripten som används när du kör SortCL-programmet. De flesta SCD-typer använder en fullständig yttre koppling för att matcha poster från den ursprungliga datakällan med poster i uppdateringskällan baserat på att likställa en nyckel från varje. Poster med matchningar måste uppdateras i mastern. Poster i uppdateringskällan som inte har en matchning måste läggas till i mastern.
Här är en översikt över hur man uppdaterar en dimensionsfil med SCD Type 2 där jag underhåller produktkostnaderna. Uppdateringen görs genom att ansluta med avseende på fältet Produktkod .
SCD av typ 2
I denna modell förvaras de nuvarande och de historiska dokumenten i samma fil. I en aktiv databas skulle du sannolikt ha en surrogatnyckel att använda som primärnyckel för att länka till faktatabellerna förutom Produktkoden nyckel som används för uppdateringsprocessen. Eftersom de aktuella posterna och de historiska posterna finns i samma fil, är det nödvändigt att ha ett fält som anger om posten är den aktuella posten för ProductCode och vi behöver ett fält för att indikera när kostnaden för Produktkoden är inte längre effektiv. I det här exemplet har vi:
- Produktkod :Detta är identifieringsnyckelfältet.
- Kostnad :Kostnad som trädde i kraft på Startdatum för protokollet.
- Startdatum :detta är det datum då kostnaden för posten trädde i kraft.
- Slutdatum :Detta är datumet då kostnaden i posten är inte längre effektiv. Om kostnaden fortfarande gäller kommer Slutdatumet att ställas in på 99991231. Detta för att undvika ett nollvärde i det här fältet.
- Aktuell :Y om kostnaden fortfarande gäller, N om den inte är det.
Startbordet har redan 3 historikrekord. Det är de som har värdet N för fältet Current . Huvudkällan heter master2.dat och den innehåller följande data:
Produktkod | Kostnad | Startdatum | Slutdatum | Aktuell |
---|---|---|---|---|
C123 | 125,50 | 20110228 | 99991231 | Y |
F112 | 2365.00 | 20120101 | 99991231 | Y |
G101 | 19.25 | 20110930 | 99991231 | Y |
G101 | 21.25 | 20110501 | 20110930 | N |
J245 | 450,50 | 20110430 | 99991231 | Y |
J245 | 425.25 | 20101001 | 20110430 | N |
J245 | 385.25 | 20100215 | 20101001 | N |
S022 | 98,75 | 20110515 | 99991231 | Y |
Uppdateringsposterna har alla samma Startdatum . Update.dat-källan innehåller poster med följande fältvärden:
Produktkod | Kostnad | Startdatum |
---|---|---|
F112 | 2425.00 | 20120701 |
J245 | 550.50 | 20120701 |
M447 | 101,75 | 20120701 |
S022 | 101,75 | 20120701 |
I IRI Workbench finns det en Voracity-guide som hjälper dig att skapa skript för uppdatering av dimensionsfiler och tabeller. Den här guiden finns i rullgardinsmenyn Voracity i navigeringsfältet. Först väljer du SCD-typen. Då visas fönstret där du väljer de källor som används för att bearbeta uppdateringen. För typ 2 är målet normalt den ursprungliga huvudfilen eller tabellen.
Med nästa skärm bestämmer du hur uppdateringsdatan mappas och hur andra fält- eller kolumnvärden ställs in. update.Cost kommer att mappas till Master2.cost och uppdateringen. Startdatum kommer att mappas till master2.StartDate . Flaggafältet är fältet som används för att fastställa posten med den aktiva kostnaden. Det vill säga om värdena i posten är aktiva eller historiska. I det här fallet, Flaggafältet är fältet Aktuell . Flagga positivt värde är värdet i Aktuell som avgör om kostnaden är den aktuella kostnaden; värdet är "Y" i vårt exempel och Flagga negativt värde är "N". Slutfältet innehåller namnet på fältet som innehåller värdet som används för att avgöra när kostnaden för posten inte längre är effektiv och Master.EndDate har det värdet. Slutvärde används som värde för Slutfält när posten innehåller de aktuella värdena för en Produktkod .
Nästa skärm är för att definiera kopplingen som utförs med master- och uppdateringskällorna. Du bör notera att båda källorna måste beställas med avseende på ProductCode . Om de inte är det måste du välja NOT_SORTED i rullgardinsmenyn för Sorteringsalternativ under datakällan som behöver sorteras.
Här är jobbmanuset:
/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 ""
Den nya huvudfilen kommer att ha dessa värden:
Produktkod | Kostnad | Startdatum | Slutdatum | Aktuell |
---|---|---|---|---|
C123 | 125,50 | 20110228 | 99991231 | Y |
F112 | 2425.00 | 20120701 | 99991231 | Y |
F112 | 2365.00 | 20120101 | 20120701 | N |
G101 | 19.25 | 20110930 | 99991231 | Y |
G101 | 21.25 | 20110501 | 20110930 | N |
J245 | 550.50 | 20120701 | 99991231 | Y |
J245 | 450,50 | 20110430 | 20120701 | N |
J245 | 425.25 | 20101001 | 20110430 | N |
J245 | 385.25 | 20100215 | 20101001 | N |
M447 | 101,75 | 20120701 | 99991231 | Y |
S022 | 101,75 | 20120701 | 99991231 | Y |
S022 | 98,75 | 20110515 | 20120701 | N |