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

SCD tipo 6

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