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 originale con i record nell'origine aggiornata in base all'equazione di una chiave di ciascuno. 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 o una tabella utilizzando l'SCD di tipo 6 in cui sto mantenendo i costi del prodotto. L'aggiornamento avviene unendo rispetto al campo ProductCode .
SCD di tipo 6
Il Tipo 6 è un ibrido che è una combinazione di Tipo 1, Tipo 2 e Tipo 3. Si chiama Tipo 6 perché 1+2+3=6. Ogni record avrà avrà i seguenti campi:
- Codice Prodotto : Questo è il campo della chiave dell'identificatore.
- Costo :Costo attuale del prodotto.
- Costo storico :costo entrato in vigore alla data di inizio per quel record.
- Data di inizio :Data di entrata in vigore dello HistoricalCost.
- Data di fine :Data in cui HistoricalCost per il record non era più l'attuale CurrentCost. Se HistoricalCost è ancora il costo corrente, EndDate è 99991231.
- Attuale :Y se il Costo è ancora attuale, N se non lo è
Per ora diamo un'occhiata ai record per ProductCode J245. Cominciamo quando il primo HistoricalCost era il costo attuale. Il Costo Storico è lo stesso del Costo. C'è quindi un record per ProductCode J245 e ha i valori mostrati di seguito:
Codice prodotto | Costo | Costo storico | StartDate | EndDate | Attuale |
---|---|---|---|---|---|
J245 | 385,25 | 385,25 | 20100215 | 99991231 | S |
Quando è necessario implementare un nuovo costo, i valori nel record di aggiornamento vengono utilizzati per aggiungere un nuovo record corrente. Il Costo Corrente in tutti i record con il codice prodotto J245 verrà modificato in Costo valore dal record di aggiornamento mentre HistoricalCost rimane lo stesso per i record esistenti. Inoltre, la EndDate per il vecchio record corrente viene modificato in StartDate per il nuovo record corrente. Nei registri con ProductCode J245, il Costo Corrente campo nel file principale aggiornato ora ha i seguenti valori:
Codice prodotto | Costo | Costo storico | StartDate | EndDate | Attuale |
---|---|---|---|---|---|
J245 | 425,25 | 425,25 | 20101001 | 99991231 | S |
J245 | 425,25 | 385,25 | 20100215 | 20101001 | N |
Ora aggiorneremo con il prossimo nuovo costo e otterremo i seguenti valori per i record J245:
Codice prodotto | Costo | Costo storico | StartDate | EndDate | Attuale |
---|---|---|---|---|---|
J245 | 450,50 | 450,50 | 20110430 | 99991231 | S |
J245 | 450,50 | 425,25 | 20101001 | 20110430 | N |
J245 | 450,50 | 385,25 | 20100215 | 20101001 | N |
L'aggiornamento finale crea record con questi valori:
Codice prodotto | Costo | Costo storico | StartDate | EndDate | Attuale |
---|---|---|---|---|---|
J245 | 550,50 | 550,50 | 20120701 | 99991231 | S |
J245 | 550,50 | 450,50 | 20110430 | 20120701 | N |
J245 | 550,50 | 425,25 | 20101001 | 20110430 | N |
J245 | 550,50 | 385,25 | 20100215 | 20101001 | N |
Ecco i valori nel file master prima dell'aggiornamento:
Codice prodotto | Costo | Costo storico | StartDate | EndDate | Attuale |
---|---|---|---|---|---|
C123 | 125,50 | 125,50 | 20110228 | 99991231 | S |
F112 | 2365.00 | 2365.00 | 20120101 | 99991231 | S |
G101 | 19:25 | 19:25 | 20110930 | 99991231 | S |
G101 | 19:25 | 21:25 | 20110501 | 20110930 | N |
J245 | 450,50 | 450,50 | 20110430 | 99991231 | S |
J245 | 450,50 | 425,25 | 20101001 | 20110430 | N |
J245 | 450,50 | 385,25 | 20100215 | 20101001 | N |
S022 | 98,75 | 98,75 | 20110515 | 99991231 | S |
I dati di aggiornamento avranno tutti la stessa StartDate . L'origine update.dat contiene i seguenti valori:
Codice prodotto | Costo | Data di inizio |
---|---|---|
F112 | 2425,00 | 20120701 |
J245 | 550,50 | 20120701 |
M447 | 101,75 | 20120701 |
S022 | 101,75 | 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 le origini utilizzate per l'elaborazione dell'aggiornamento. Per il tipo 6, la destinazione è normalmente il file master o la tabella originale.
Nella schermata successiva si determina come vengono mappati i dati di aggiornamento e come vengono impostati altri valori di campo o colonna. Il aggiornamento.Costo il campo verrà mappato a master6.CurrentCost e update.StartDate il campo verrà mappato a master6.StartDate . Il Campo Bandiera è il campo utilizzato per determinare se il record contiene i valori di campo più recenti. In questo caso quel campo è master6.current . Se è il record più recente, allora CurrentCost campo e il HistoryCost campo avrà gli stessi valori. Il valore positivo segnalato è il valore in master6.Current che determina che i valori del campo sono i valori più recenti per un CodiceProdotto . In questo caso, il valore è "Y" nel nostro esempio e il Valore negativo segnalato è "N". Fine campo contiene il nome del campo che contiene il valore utilizzato per determinare quando il Costo per il record non è più efficace e Master.EndDate detiene quel valore. Valore finale viene utilizzato come valore per Fine campo quando il record è aggiornato.
La schermata successiva serve per definire il join eseguito con il master e le sorgenti di aggiornamento. Tieni presente che entrambe le fonti devono essere ordinate rispetto a ProductCode . In caso contrario, devi selezionare NOT_SORTED nel menu a discesa per Opzione di ordinamento sotto l'origine dati che deve essere ordinata.
Ecco il primo script di lavoro:
/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
Per rivedere,
- Il valore per Costo Corrente sarà lo stesso per tutti i record che hanno un ProductCode comune
- Data di inizio è la data in cui il HistoricalCost entrato in vigore
- Per la registrazione più recente di un Codice prodotto
- i valori per CurrentCost e Costo Storico sono gli stessi
- la Data di fine è 99991231
- Il valore in Corrente è Y
- Per i record che non sono il record corrente
- Data di fine è la data in cui il successivo Costo più recente entrato in vigore
- Il campo Attuale ha N per il valore
Il nuovo file anagrafico non verrà ordinato perché i nuovi record anagrafici correnti sono stati aggiunti in fondo al file principale che avrà valori come questo:
Codice prodotto | Costo | Costo storico | StartDate | EndDate | Attuale |
---|---|---|---|---|---|
C123 | 125,50 | 125,50 | 20110228 | 99991231 | S |
F112 | 2425,00 | 2365.00 | 20120101 | 20120701 | N |
G101 | 19:25 | 19:25 | 20110930 | 99991231 | S |
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 | S |
J245 | 550,50 | 550,50 | 20120701 | 99991231 | S |
M447 | 139,25 | 139,25 | 20120701 | 99991231 | S |
S022 | 101,75 | 101,75 | 20120701 | 99991231 | S |