Dimensionsdata, der ændrer sig langsomt eller uforudsigeligt, fanges i Slowly Changing Dimensions (SCD) analyser. I et datavarehusmiljø har en dimensionstabel en primær nøgle, der unikt identificerer hver post og andre oplysninger, der er kendt som dimensionsdata.
Alle opdateringsmetoderne for de forskellige SCD-typer kan udføres ved hjælp af SortCL-programmet i IRI CoSort. I IRI Voracity er der en guide til at hjælpe med at skabe de SCD-jobscripts, der bruges ved kørsel af SortCL-programmet. De fleste variationer bruger en fuld ydre sammenføjning til at matche poster fra den originale stamdatakilde med poster i den opdaterede kilde baseret på at sidestille en nøgle fra hver. Optegnelser med kampe skal opdateres i masteren. Poster i opdateringskilden, der ikke har et match, skal tilføjes til masteren.
Her er en oversigt over, hvordan man opdaterer en dimensionsfil ved hjælp af SCD Type 3, hvor jeg vedligeholder produktomkostninger. Opdateringen udføres ved at slutte sig til feltet ProductCode .
Type 3 SCD
Med Type 3-modellen føres de aktuelle data og de historiske data i samme post. En af de vigtigste ting at beslutte er, hvor meget historie skal opbevares. Med vores eksempel vil jeg beholde en pris for tre startdatoer. Slutdato er den dato, hvor omkostningerne i posten ikke længere er effektive. Hvis omkostningerne stadig er effektive, er Slutdato1 feltet vil blive sat til 99991231. Dette er for at undgå en tom værdi i dette felt. Her er værdierne indeholdt i startmasterkilden (master3.dat):
Produktkode | Pris1 | Startdato1 | Slutdato1 | Pris2 | Startdato2 | Slutdato2 | Pris3 | Startdato3 | Slutdato3 |
---|---|---|---|---|---|---|---|---|---|
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 |
Opdateringsposterne har alle den samme startdato. Update.dat-kilden indeholder følgende feltværdier for posterne:
Produktkode | Omkostninger | Startdato |
---|---|---|
F112 | 2425.00 | 20120701 |
J245 | 550,50 | 20120701 |
M447 | 101,75 | 20120701 |
S022 | 101,75 | 20120701 |
Nedenfor er de opdaterede data. For hver post, der blev opdateret, flyttes hver pris, startdato og slutdato til højre med ét sæt. I den gamle aktuelle gruppe ændres slutdatoen til startdatoen for det nye opdaterede aktuelle sæt. Eventuelle værdier for det gamle tredje sæt kasseres.
Produktkode | Pris1 | Startdato1 | Slutdato1 | Pris2 | Startdato2 | Slutdato2 | Pris3 | Startdato3 | Slutdato3 |
---|---|---|---|---|---|---|---|---|---|
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 er der en Voracity-guide til at hjælpe med oprettelsen af scripts til opdatering af dimensionsfiler og tabeller. Denne guide er placeret i rullemenuen Voracity på navigationslinjen. Først vælger du SCD-typen. Derefter vises vinduet, hvor du vælger de filer, der skal bruges til at behandle opdateringen.
I den øverste tabel på det næste skærmbillede bestemmer du, hvordan de data, der opdateres, tilknyttes masteren. I den midterste gruppering på skærmen skal du vælge de felter, der giver statusværdierne for de poster, der opdateres.
I rullemenuerne under Aktuel og Historiske feltsæt , det første sæt, du definerer, giver feltnavne for aktuelle værdier. Værdifelt er den dimensionelle værdi, der opdateres. Startfelt er det felt, der bestemmer, hvornår Værdifeltet blev aktiv og Afslut felt bestemmer, hvornår den ikke længere er gyldig. Definer derefter så mange sæt, som du har brug for, for antallet af historiske værdier, der opbevares.
Her er jobscriptet, der opdaterer masterfilen:
/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 ""