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

SCD typ 3

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í ke spárování záznamů z původního hlavní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 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 3, kde udržuji náklady na produkt. Aktualizace se provede připojením s ohledem na pole ProductCode .

SCD typu 3

U modelu typu 3 jsou aktuální data a historická data přenášena ve stejném záznamu. Jednou z hlavních věcí, které je třeba rozhodnout, je, kolik historie by se mělo uchovávat. S naším příkladem ponechám náklady na tři počáteční data. Koncové datum je datum, kdy náklady v záznamu již nejsou účinné. Pokud jsou náklady stále efektivní, pak Datum ukončení1 pole bude nastaveno na 99991231. Tím se zabrání prázdné hodnotě v tomto poli. Zde jsou hodnoty obsažené ve výchozím hlavním zdroji (master3.dat):

Kód produktu Cena 1 Datum zahájení1 Datum ukončení1 Cena 2 Datum zahájení2 Datum konce2 Cena 3 StartDate3 Datum ukončení 3
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

Všechny záznamy aktualizace mají stejné počáteční datum. Zdroj update.dat obsahuje následující hodnoty polí pro záznamy:

Kód produktu Cena Datum zahájení
F112 2425,00 20120701
J245 550,50 20120701
M447 101,75 20120701
S022 101,75 20120701

Níže jsou aktualizované údaje. Pro každý záznam, který byl aktualizován, se každá cena, počáteční datum a koncové datum přesunou o jednu sadu doprava. Ve staré aktuální skupině pro záznam se koncové datum změní na počáteční datum pro novou aktualizovanou aktuální sadu. Všechny hodnoty pro starou třetí sadu jsou vyřazeny.

Kód produktu Cena 1 Datum zahájení1 Datum ukončení1 Cena 2 Datum zahájení2 Datum konce2 Cena 3 StartDate3 Datum ukončení 3
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

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 soubory, které se použijí pro zpracování aktualizace.

V horní tabulce na další obrazovce určíte, jak jsou aktualizovaná data mapována na master. V prostředním seskupení na obrazovce vyberte pole, která poskytují hodnoty stavu pro záznamy, které se aktualizují.

V rozbalovacích nabídkách pod Aktuální a Historické sady polí , první sada, kterou definujete, poskytuje názvy polí pro aktuální hodnoty. Pole hodnoty je rozměrová hodnota, která se aktualizuje. Počáteční pole je pole, které určuje, kdy bude pole hodnoty se stal aktivním a Ukončit pole určuje, kdy již neplatí. Poté definujte tolik sad, kolik potřebujete pro počet uchovávaných historických hodnot.

Zde je skript úlohy, který aktualizuje hlavní soubor:

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

  1. Jak napsat klauzuli ORDER BY s výjimkami pomocí SQL

  2. Jak používat DISTINCT v SQL

  3. Jak FLOOR() funguje v MariaDB

  4. Jak mohu uniknout znaku procenta v T-SQL?