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

SCD typ 6

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

  1. Souhrnná funkce za daný časový interval

  2. Převeďte postgresové zobrazení data na řetězec ISO 8601

  3. Jak používat funkce SQL Server AlwaysOn

  4. Výběr databázového proxy pro MySQL a MariaDB