Dimensionsdata som förändras långsamt eller oförutsägbart fångas i Slowly Changing Dimensions (SCD) analyser. 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 varianter använder en fullständig yttre koppling för att matcha poster från den ursprungliga huvuddatakällan med poster i den uppdaterade kä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 3 där jag underhåller produktkostnaderna. Uppdateringen görs genom att gå med i fältet Produktkod .
Typ 3 SCD
Med typ 3-modellen lagras aktuella data och historiska data i samma post. En av de viktigaste sakerna att bestämma är hur mycket historia som ska bevaras. Med vårt exempel kommer jag att hålla en kostnad för tre startdatum. Slutdatum är det datum då kostnaden i posten inte längre är effektiv. Om kostnaden fortfarande är effektiv, är Slutdatum1 fältet sätts till 99991231. Detta för att undvika ett tomt värde i detta fält. Här är värdena som finns i starthuvudkällan (master3.dat):
Produktkod | Kostnad1 | Startdatum1 | Slutdatum1 | Kostnad2 | Startdatum2 | Slutdatum2 | Kostnad3 | Startdatum3 | Slutdatum3 |
---|---|---|---|---|---|---|---|---|---|
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 |
Uppdateringsposterna har alla samma startdatum. Update.dat-källan innehåller följande fältvärden för posterna:
Produktkod | Kostnad | Startdatum |
---|---|---|
F112 | 2425.00 | 20120701 |
J245 | 550.50 | 20120701 |
M447 | 101,75 | 20120701 |
S022 | 101,75 | 20120701 |
Nedan finns uppdaterade data. För varje post som uppdaterades flyttas varje kostnad, startdatum och slutdatum åt höger med en uppsättning. I den gamla nuvarande gruppen ändras slutdatumet till startdatumet för den nya uppdaterade nuvarande uppsättningen. Alla värden för den gamla tredje uppsättningen kasseras.
Produktkod | Kostnad1 | Startdatum1 | Slutdatum1 | Kostnad2 | Startdatum2 | Slutdatum2 | Kostnad3 | Startdatum3 | Slutdatum3 |
---|---|---|---|---|---|---|---|---|---|
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 |
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 filer som används för att bearbeta uppdateringen.
I den översta tabellen på nästa skärm bestämmer du hur data som uppdateras mappas till mastern. I mittgrupperingen på skärmen väljer du fälten som ger statusvärdena för de poster som uppdateras.
I rullgardinsmenyn under Aktuell och Historiska fältuppsättningar , den första uppsättningen som du definierar, ger fältnamnen för aktuella värden. Värdefält är det dimensionella värdet som uppdateras. Startfält är fältet som avgör när Värdefältet blev aktiv och Avsluta fält avgör när den inte längre är giltig. Definiera sedan så många uppsättningar som du behöver för antalet historiska värden som sparas.
Här är jobbskriptet som kommer att uppdatera huvudfilen:
/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 ""