Rozměrová data, která se mění pomalu nebo nepředvídatelně, jsou zachycena v analýzách Slowly Changing Dimensions (SCD). V prostředí datového skladu má tabulka dimenzí primární klíč, který jednoznačně identifikuje každý záznam a další informace, které jsou známé jako dimenzionální data.
Všechny metody aktualizace pro různé typy SCD lze provést pomocí programu SortCL v IRI CoSort. V IRI Voracity existuje průvodce, který pomáhá při vytváření skriptů úloh SCD používaných při spouštění programu SortCL. Většina variant používá úplné vnější spojení k porovnání záznamů z původního zdroje dat se záznamy v aktualizovaném zdroji na základě ztotožnění klíče z každého z nich. Záznamy ve zdroji aktualizací, které nemají shodu, je třeba přidat do hlavního serveru.
Zde je přehled toho, jak aktualizovat rozměrový soubor nebo tabulku pomocí SCD typu 6, kde udržuji náklady na produkt. Aktualizace se provede spojením s ohledem na pole ProductCode .
SCD typu 6
Typ 6 je hybrid, který je kombinací typu 1, typu 2 a typu 3. Říká se mu typ 6, protože 1+2+3=6. Každý záznam bude mít následující pole:
- Kód produktu : Toto je pole klíče identifikátoru.
- Cena :Aktuální cena produktu.
- Historické náklady :Cena, která vstoupila v platnost v počáteční datum pro daný záznam.
- Datum zahájení :Datum, kdy HistoricalCost vstoupily v platnost.
- Datum ukončení :Datum, kdy HistoricalCost pro záznam již nebyly aktuální CurrentCost. Pokud je HistoricalCost stále aktuální cenou, pak EndDate je 99991231.
- Aktuální :Y, pokud jsou náklady stále aktuální, N, pokud nejsou
Nyní se podívejme na záznamy pro ProductCode J245. Začněme, když budou první Historické náklady byly aktuální náklady. HistoricalCost je stejná jako cena. Potom existuje jeden záznam pro ProductCode J245 a má hodnoty uvedené níže:
Kód produktu | Cena | Historické náklady | Datum zahájení | Datum ukončení | Aktuální |
---|---|---|---|---|---|
J245 | 385,25 | 385,25 | 20100215 | 99991231 | Y |
Když je třeba implementovat nové náklady, hodnoty v záznamu aktualizace se použijí k přidání nového aktuálního záznamu. Aktuální cena ve všech záznamech s kódem produktu J245 se změní na Cena hodnotu ze záznamu aktualizace, zatímco Historické náklady zůstává stejný pro stávající záznamy. Kromě toho Datum ukončení pro starý aktuální záznam se změní na Počáteční datum pro nový aktuální rekord. V záznamech s Kódem produktu J245, Aktuální cena pole v aktualizovaném hlavním souboru má nyní následující hodnoty:
Kód produktu | Cena | Historické náklady | Datum zahájení | Datum ukončení | Aktuální |
---|---|---|---|---|---|
J245 | 425,25 | 425,25 | 20101001 | 99991231 | Y |
J245 | 425,25 | 385,25 | 20100215 | 20101001 | N |
Nyní provedeme aktualizaci s další novou cenou a získáme následující hodnoty pro záznamy J245:
Kód produktu | Cena | Historické náklady | Datum zahájení | Datum ukončení | Aktuální |
---|---|---|---|---|---|
J245 | 450,50 | 450,50 | 20110430 | 99991231 | Y |
J245 | 450,50 | 425,25 | 20101001 | 20110430 | N |
J245 | 450,50 | 385,25 | 20100215 | 20101001 | N |
Poslední aktualizace vytvoří záznamy, které mají tyto hodnoty:
Kód produktu | Cena | Historické náklady | Datum zahájení | Datum ukončení | Aktuální |
---|---|---|---|---|---|
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 |
Zde jsou hodnoty v hlavním souboru před aktualizací:
Kód produktu | Cena | Historické náklady | Datum zahájení | Datum ukončení | Aktuální |
---|---|---|---|---|---|
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 |
Data aktualizace budou mít všechny stejné Datum zahájení . Zdroj update.dat obsahuje následující hodnoty:
Kód produktu | Cena | Datum zahájení |
---|---|---|
F112 | 2425,00 | 20120701 |
J245 | 550,50 | 20120701 |
M447 | 101,75 | 20120701 |
S022 | 101,75 | 20120701 |
V IRI Workbench je průvodce Voracity, který pomáhá při vytváření skriptů pro aktualizaci Dimensional souborů a tabulek. Tento průvodce se nachází v rozevíracím seznamu Voracity na navigační liště. Nejprve vyberte typ SCD. Poté se zobrazí okno, kde vyberete zdroje, které jsou použity pro zpracování aktualizace. Pro typ 6 je cílem obvykle původní hlavní soubor nebo tabulka.
Na další obrazovce určíte, jak jsou mapována data aktualizace a jak se nastavují další hodnoty polí nebo sloupců. update.Cost pole se namapuje na master6.CurrentCost a update.StartDate pole se namapuje na master6.StartDate . Pole vlajky je pole, které se používá k určení, zda záznam obsahuje nejnovější hodnoty pole. V tomto případě je toto pole master6.current . Pokud se jedná o nejaktuálnější záznam, pak CurrentCost pole a HistoryCost pole bude mít stejné hodnoty. Označit kladnou hodnotu je hodnota v master6.Current což určuje, že hodnoty polí jsou nejnovějšími hodnotami pro ProductCode . V takovém případě je v našem příkladu hodnota „Y“ a příznaková záporná hodnota je „N“. Konec pole obsahuje název pole, které obsahuje hodnotu použitou k určení, kdy cena záznamu již není účinná, a Master.EndDate drží tu hodnotu. Konečná hodnota se používá jako hodnota pro Konec pole když je záznam aktuální.
Další obrazovka je pro definování spojení provedeného s hlavním a aktualizačním zdrojem. Měli byste si uvědomit, že oba zdroje musí být objednány s ohledem na ProductCode . Pokud nejsou, musíte v rozevírací nabídce pro Možnost řazení vybrat NOT_SORTED pod zdrojem dat, který je třeba seřadit.
Zde je první skript úlohy:
/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
Chcete-li zkontrolovat,
- Hodnota pro CurrentCost bude stejný pro všechny záznamy, které mají společný ProductCode
- Datum zahájení je datum, kdy Historická cena nabylo účinnosti
- Nejaktuálnější záznam ProductCode
- hodnoty CurrentCost a Historické náklady jsou stejné
- Datum ukončení je 99991231
- Hodnota v Aktuální je Y
- Pro záznamy, které nejsou aktuálním záznamem
- Datum ukončení je datum, kdy další novější Cena nabylo účinnosti
- Pole Aktuální má N pro hodnotu
Nový hlavní soubor nebude seřazen, protože nové aktuální hlavní záznamy byly přidány na konec hlavního souboru, který bude mít tyto hodnoty:
Kód produktu | Cena | Historické náklady | Datum zahájení | Datum ukončení | Aktuální |
---|---|---|---|---|---|
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 |