Database
 sql >> Database >  >> RDS >> Database

SCD tipo 3

I dati dimensionali che cambiano lentamente o in modo imprevedibile vengono acquisiti nelle analisi delle dimensioni che cambiano lentamente (SCD). In un ambiente di data warehouse, una tabella dimensionale dispone di una chiave primaria che identifica in modo univoco ogni record e altre informazioni note come dati dimensionali.

Tutti i metodi di aggiornamento per i diversi tipi di SCD possono essere eseguiti utilizzando il programma SortCL in IRI CoSort. In IRI Voracity è disponibile una procedura guidata per facilitare la creazione degli script di lavoro SCD utilizzati durante l'esecuzione del programma SortCL. La maggior parte delle varianti utilizza un join esterno completo per abbinare i record dell'origine dati anagrafica originale con i record nell'origine aggiornata in base all'equazione di una chiave di ciascuno. I record con le corrispondenze devono essere aggiornati nel master. I record nell'origine degli aggiornamenti che non hanno una corrispondenza devono essere aggiunti al master.

Ecco una panoramica di come aggiornare un file dimensionale utilizzando l'SCD di tipo 3 in cui mantengo i costi del prodotto. L'aggiornamento viene effettuato unendo rispetto al campo ProductCode .

SCD di tipo 3

Con il modello di tipo 3, i dati attuali e quelli storici sono riportati nello stesso record. Una delle cose principali da decidere è quanta storia dovrebbe essere conservata. Con il nostro esempio, manterrò un costo per tre date di inizio. Enddate è la data in cui il costo nel record non è più effettivo. Se il costo è ancora effettivo, allora EndDate1 il campo verrà impostato su 99991231. Questo per evitare un valore vuoto in questo campo. Ecco i valori contenuti nella sorgente master iniziale (master3.dat):

Codice prodotto Costo1 StartDate1 EndDate1 Costo2 StartDate2 EndDate2 Costo3 StartDate3 EndDate3
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

I record di aggiornamento hanno tutti lo stesso StartDate. L'origine update.dat contiene i seguenti valori di campo per i record:

Codice prodotto Costo Data di inizio
F112 2425,00 20120701
J245 550,50 20120701
M447 101,75 20120701
S022 101,75 20120701

Di seguito i dati aggiornati. Per ogni record che è stato aggiornato, ogni costo, data di inizio e data di fine viene spostato a destra di un set. Nel vecchio gruppo corrente per il record, la data di fine viene modificata in data di inizio per il nuovo set corrente aggiornato. Tutti i valori per il vecchio terzo set vengono scartati.

Codice prodotto Costo1 StartDate1 EndDate1 Costo2 StartDate2 EndDate2 Costo3 StartDate3 EndDate3
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

In IRI Workbench, è disponibile una procedura guidata Voracity per assistere nella creazione di script per l'aggiornamento di file e tabelle dimensionali. Questa procedura guidata si trova nel menu a discesa Voracity sulla barra di navigazione. Per prima cosa scegli il tipo di SCD. Quindi viene visualizzata la finestra in cui si selezionano i file utilizzati per l'elaborazione dell'aggiornamento.

Nella tabella in alto nella schermata successiva, si determina come i dati aggiornati vengono mappati sul master. Nel raggruppamento centrale dello schermo, scegli i campi che forniscono i valori di stato per i record in fase di aggiornamento.

Nei menu a discesa in Attuale e Insiemi di campi storici , il primo set definito, fornisce i nomi dei campi per i valori correnti. Campo di valore è il valore dimensionale che viene aggiornato. Campo di inizio è il campo che determina quando il Campo valore è diventato attivo e Fine campo determina quando non è più valido. Quindi definisci tutti i set necessari per il numero di valori storici che vengono mantenuti.

Ecco lo script del lavoro che aggiornerà il file master:

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