sql >> Databáze >  >> RDS >> Database

SCD typ 2

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 typů SCD používá úplné vnější spojení k porovnání záznamů z původního zdroje dat se záznamy ve zdroji aktualizace na základě ztotožnění klíče z každého z nich. Záznamy se shodami je třeba aktualizovat v masteru. 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 pomocí SCD typu 2, kde udržuji náklady na produkt. Aktualizace se provede spojením s ohledem na pole ProductCode .

SCD typu 2

V tomto modelu jsou aktuální a historické záznamy vedeny ve stejném souboru. V aktivní databázi byste pravděpodobně měli náhradní klíč, který byste mohli použít jako primární klíč pro propojení s tabulkami faktů kromě ProductCode klíč, který se používá pro proces aktualizace. Protože aktuální záznamy a historické záznamy jsou obsaženy ve stejném souboru, je nutné mít pole, které udává, zda je záznam aktuálním záznamem pro ProductCode a potřebujeme pole pro uvedení ceny ProductCode již není efektivní. V tomto příkladu máme:

  • Kód produktu :Toto je pole klíče identifikátoru.
  • Cena :Náklady, které vstoupily v platnost Datum zahájení pro záznam.
  • Datum zahájení :toto je datum, kdy se náklady na záznam staly účinnými.
  • Datum ukončení :Toto je datum, kdy Cena v záznamu již není účinný. Pokud je cena stále platná, koncové datum bude nastaveno na 99991231. To proto, aby se zabránilo nulové hodnotě v tomto poli.
  • Aktuální :Y, pokud jsou náklady stále platné, N, pokud nejsou.

Startovní tabulka má již 3 historické záznamy. Jsou to ty, které mají hodnotu N pro pole Aktuální . Hlavní zdroj se nazývá master2.dat a obsahuje níže uvedená data:

Kód produktu Cena Datum zahájení Datum ukončení Aktuální
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

Všechny záznamy aktualizace mají stejné Datum zahájení . Zdroj update.dat obsahuje záznamy s následujícími hodnotami polí:

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. U typu 2 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 se namapuje na Master2.cost a aktualizace. Datum zahájení se namapuje na master2.StartDate . Pole vlajky je pole, které se používá k určení záznamu s aktivními náklady. Tedy zda jsou hodnoty v záznamu aktivní nebo historické. V tomto případě Pole příznaku je pole Aktuální . Označit kladnou hodnotu je hodnota v Aktuální to určuje, zda Cena je aktuální Cena; hodnota je v našem příkladu „Y“ a označit zápornou hodnotu je „N“. Koncové pole obsahuje název pole, které obsahuje hodnotu použitou k určení, kdy již cena záznamu přestane platit a Master.EndDate drží tu hodnotu. Konečná hodnota se používá jako hodnota pro Konec pole když záznam obsahuje aktuální hodnoty pro ProductCode .

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 vybrat možnost NOT_SORTED v rozevíracím seznamu Možnost řazení pod zdrojem dat, který je třeba seřadit.

Zde je skript úlohy:

/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 ""

Nový hlavní soubor bude mít tyto hodnoty:

Kód produktu Cena Datum zahájení Datum ukončení Aktuální
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

  1. Funkce IndexOf v T-SQL

  2. Proces aktualizace krok za krokem pro aktualizaci R12.2, část -1

  3. Nekonečná smyčka CTE s OPTION (max. rekurze 0)

  4. Duplikujte, kopírujte nebo zálohujte tabulky v MySQL, MariaDB, Oracle, PostgreSQL, DB2 a SQLite pomocí Create Table As SQL