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, når du kører SortCL-programmet. De fleste varianter bruger en fuld ydre sammenføjning til at matche poster fra den originale datakilde med poster i den opdaterede kilde baseret på at sidestille en nøgle fra hver. Poster i opdateringskilden, der ikke har et match, skal tilføjes til masteren.
Her er en oversigt over, hvordan man opdaterer en dimensionsfil eller tabel ved hjælp af SCD Type 6, hvor jeg vedligeholder produktomkostninger. Opdateringen udføres ved at slutte sig til feltet ProductCode .
Type 6 SCD
Type 6 er en hybrid, der er en kombination af Type 1, Type 2 og Type 3. Den kaldes Type 6, fordi 1+2+3=6. Hver post vil have følgende felter:
- Produktkode : Dette er identifikationsnøglefeltet.
- Omkostninger :Nuværende pris for produktet.
- Historiske omkostninger :Omkostninger, der trådte i kraft på startdatoen for denne registrering.
- Startdato :Dato, hvor de historiske omkostninger trådte i kraft.
- Slutdato :Dato, hvor den historiske pris ikke længere var den aktuelle CurrentCost. Hvis den historiske pris stadig er den aktuelle pris, er slutdatoen 99991231.
- Aktuel :Y hvis omkostninger stadig er aktuelle, N hvis det ikke er
Lad os nu bare se på posterne for Produktkode J245. Lad os starte, når de tidligste Historiske omkostninger var den nuværende Omkostning. De historiske omkostninger er de samme som omkostningerne. Der er så én post for ProductCode J245, og den har værdierne vist nedenfor:
Produktkode | Omkostninger | Historiske omkostninger | Startdato | Slutdato | Aktuel |
---|---|---|---|---|---|
J245 | 385.25 | 385.25 | 20100215 | 99991231 | Y |
Når en ny omkostning skal implementeres, bruges værdierne i opdateringsposten til at tilføje en ny aktuel post. Nuværende omkostninger i alle registreringer med produktkoden J245 vil blive ændret til Omkostninger værdi fra opdateringsposten, mens Historical Cost forbliver den samme for de eksisterende poster. Derudover er Slutdato for den gamle nuværende post er ændret til Startdato til den nye nuværende rekord. I posterne med ProductCode J245, Current Cost feltet i den opdaterede masterfil har nu nedenstående værdier:
Produktkode | Omkostninger | Historiske omkostninger | Startdato | Slutdato | Aktuel |
---|---|---|---|---|---|
J245 | 425.25 | 425.25 | 20101001 | 99991231 | Y |
J245 | 425.25 | 385.25 | 20100215 | 20101001 | N |
Nu vil vi opdatere med den næste nye pris og få følgende værdier for J245-posterne:
Produktkode | Omkostninger | Historiske omkostninger | Startdato | Slutdato | Aktuel |
---|---|---|---|---|---|
J245 | 450,50 | 450,50 | 20110430 | 99991231 | Y |
J245 | 450,50 | 425.25 | 20101001 | 20110430 | N |
J245 | 450,50 | 385.25 | 20100215 | 20101001 | N |
Den endelige opdatering opretter poster, der har disse værdier:
Produktkode | Omkostninger | Historiske omkostninger | Startdato | Slutdato | Aktuel |
---|---|---|---|---|---|
J245 | 550,50 | 550,50 | 20120701 | 99991231 | Y |
J245 | 550,50 | 450,50 | 20110430 | 20120701 | N |
J245 | 550,50 | 425.25 | 20101001 | 20110430 | N |
J245 | 550,50 | 385.25 | 20100215 | 20101001 | N |
Her er værdierne i masterfilen før opdatering:
Produktkode | Omkostninger | Historiske omkostninger | Startdato | Slutdato | Aktuel |
---|---|---|---|---|---|
C123 | 125,50 | 125,50 | 20110228 | 99991231 | Y |
F112 | 2365.00 | 2365.00 | 20120101 | 99991231 | Y |
G101 | 19.25 | 19.25 | 20110930 | 99991231 | Y |
G101 | 19.25 | 21.25 | 20110501 | 20110930 | N |
J245 | 450,50 | 450,50 | 20110430 | 99991231 | Y |
J245 | 450,50 | 425.25 | 20101001 | 20110430 | N |
J245 | 450,50 | 385.25 | 20100215 | 20101001 | N |
S022 | 98,75 | 98,75 | 20110515 | 99991231 | Y |
Opdateringsdataene vil alle have den samme Startdato . Update.dat-kilden indeholder følgende værdier:
Produktkode | Omkostninger | Startdato |
---|---|---|
F112 | 2425.00 | 20120701 |
J245 | 550,50 | 20120701 |
M447 | 101,75 | 20120701 |
S022 | 101,75 | 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 kilder, der skal bruges til at behandle opdateringen. For Type 6 er målet normalt den originale masterfil eller tabel.
Med det næste skærmbillede bestemmer du, hvordan opdateringsdataene kortlægges, og hvordan andre felt- eller kolonneværdier indstilles. update.Cost feltet vil tilknyttes master6.CurrentCost og update.StartDate feltet vil blive knyttet til master6.StartDate . Flagfeltet er det felt, der bruges til at bestemme, om posten indeholder de seneste feltværdier. I dette tilfælde er feltet master6.current . Hvis det er den mest aktuelle post, så er CurrentCost feltet og Historikomkostninger felt vil have de samme værdier. Den Flag positive værdi er værdien i master6.Current der bestemmer, at feltværdierne er de seneste værdier for en Produktkode . Når det er tilfældet, er værdien "Y" i vores eksempel og Flag negativ værdi er "N". Afslut felt indeholder navnet på det felt, der indeholder den værdi, der bruges til at bestemme, hvornår prisen for posten ikke længere er effektiv og Master.EndDate har den værdi. Slutværdi bruges som værdien for End Field når posten er aktuel.
Det næste skærmbillede er til at definere den sammenkædning, der udføres med master- og opdateringskilderne. Du skal bemærke, at begge kilder skal bestilles med hensyn til Produktkode . Hvis de ikke er det, skal du vælge NOT_SORTED i rullemenuen for Sort Order Option under den datakilde, der skal sorteres.
Her er det første jobscript:
/INFILE=master6.dat /PROCESS=DELIMITED /ALIAS=master6 /FIELD=(PRODUCTCODE, TYPE=ASCII, POSITION=1, SEPARATOR=",", FRAME='\"') /FIELD=(CURRENTCOST, TYPE=NUMERIC, POSITION=2, SEPARATOR=",", FRAME='\"') /FIELD=(HISTORICALCOST, TYPE=NUMERIC, POSITION=3, SEPARATOR=",", FRAME='\"') /FIELD=(STARTDATE, TYPE=ASCII, POSITION=4, SEPARATOR=",", FRAME='\"') /FIELD=(ENDDATE, TYPE=ASCII, POSITION=5, SEPARATOR=",", FRAME='\"') /FIELD=(CURRENT, TYPE=ASCII, POSITION=6, SEPARATOR=",", FRAME='\"') /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 NOT_SORTED master6 update WHERE MASTER6.PRODUCTCODE == UPDATE.PRODUCTCODE /OUTFILE=master6.dat # Make changes to records that have the same ProductCode # as records in the update file /PROCESS=DELIMITED /FIELD=(MASTER6.PRODUCTCODE, TYPE=ASCII, POSITION=1, SEPARATOR=",", FRAME='\"') /FIELD=(UPDATE.COST, TYPE=NUMERIC, POSITION=2, SEPARATOR=",", FRAME='\"') /FIELD=(MASTER6.HISTORICALCOST, TYPE=NUMERIC, POSITION=3, SEPARATOR=",", FRAME='\"') /FIELD=(MASTER6.STARTDATE, TYPE=ASCII, POSITION=4, SEPARATOR=",", FRAME='\"') /FIELD=(ENDDATE_NEW, TYPE=ASCII, POSITION=5, SEPARATOR=",", FRAME='\"', IF MASTER6.CURRENT EQ "Y" THEN UPDATE.STARTDATE ELSE MASTER6.ENDDATE) /FIELD=(CURRENT_NEW="N", TYPE=ASCII, POSITION=6, SEPARATOR=",", FRAME='\"') /INCLUDE WHERE MASTER6.PRODUCTCODE == UPDATE.PRODUCTCODE /OUTFILE=master6.dat # Keep the records that have no updates /PROCESS=DELIMITED /FIELD=(MASTER6.PRODUCTCODE, TYPE=ASCII, POSITION=1, SEPARATOR=",", FRAME='\"') /FIELD=(MASTER6.CURRENTCOST, TYPE=NUMERIC, POSITION=2, SEPARATOR=",", FRAME='\"') /FIELD=(MASTER6.HISTORICALCOST, TYPE=NUMERIC, POSITION=3, SEPARATOR=",", FRAME='\"') /FIELD=(MASTER6.STARTDATE, TYPE=ASCII, POSITION=4, SEPARATOR=",", FRAME='\"') /FIELD=(MASTER6.ENDDATE, TYPE=ASCII, POSITION=5, SEPARATOR=",", FRAME='\"') /FIELD=(MASTER6.CURRENT, TYPE=ASCII, POSITION=6, SEPARATOR=",", FRAME='\"') /OMIT WHERE MASTER6.PRODUCTCODE == UPDATE.PRODUCTCODE /OMIT WHERE MASTER6.PRODUCTCODE EQ "" /OUTFILE=master6.dat # Add the records with new product codes /PROCESS=DELIMITED /FIELD=(UPDATE.PRODUCTCODE, TYPE=ASCII, POSITION=1, SEPARATOR=",", FRAME='\"') /FIELD=(UPDATE.COST, TYPE=NUMERIC, POSITION=2, SEPARATOR=",", FRAME='\"') /FIELD=(UPDATE.COST, TYPE=NUMERIC, POSITION=3, SEPARATOR=",", FRAME='\"') /FIELD=(UPDATE.STARTDATE, TYPE=ASCII, POSITION=4, SEPARATOR=",", FRAME='\"') /FIELD=(ENDDATE_NEW="99991231", TYPE=ASCII, POSITION=5, SEPARATOR=",", FRAME='\"') /FIELD=(CURRENT_NEW="Y", TYPE=ASCII, POSITION=6, SEPARATOR=",", FRAME='\"') /OMIT WHERE UPDATE.PRODUCTCODE EQ "" /INCLUDE WHERE UPDATE.PRODUCTCODE
For at gennemgå,
- Værdien for CurrentCost vil være den samme for alle poster, der har en fælles Produktkode
- Startdato er den dato, hvor Historiske omkostninger trådte i kraft
- For den seneste registrering af en Produktkode,
- værdierne for CurrentCost og Historiske omkostninger er de samme
- Slutdatoen er 99991231
- Værdien i Aktuel er Y
- For de poster, der ikke er den aktuelle post
- Slutdato er den dato, hvor den næste nyere pris trådte i kraft
- Feltet Aktuel har N for værdien
Den nye masterfil vil ikke blive sorteret, fordi de nye aktuelle masterposter blev tilføjet til bunden af masterfilen, som vil have værdier som denne:
Produktkode | Omkostninger | Historiske omkostninger | Startdato | Slutdato | Aktuel |
---|---|---|---|---|---|
C123 | 125,50 | 125,50 | 20110228 | 99991231 | Y |
F112 | 2425.00 | 2365.00 | 20120101 | 20120701 | N |
G101 | 19.25 | 19.25 | 20110930 | 99991231 | Y |
G101 | 19.25 | 21.25 | 20110501 | 20110930 | N |
J245 | 550,50 | 450,50 | 20110430 | 20120701 | N |
J245 | 550,50 | 425.25 | 20101001 | 20110430 | N |
J245 | 550,50 | 385.25 | 20100215 | 20101001 | N |
S022 | 101,75 | 98,75 | 20110515 | 20120701 | N |
F112 | 2425.00 | 2425.00 | 20120701 | 99991231 | Y |
J245 | 550,50 | 550,50 | 20120701 | 99991231 | Y |
M447 | 139,25 | 139,25 | 20120701 | 99991231 | Y |
S022 | 101,75 | 101,75 | 20120701 | 99991231 | Y |