sql >> Base de Datos >  >> RDS >> Database

SCD tipo 3

Los datos dimensionales que cambian lentamente o de manera impredecible se capturan en análisis de dimensiones que cambian lentamente (SCD). En un entorno de almacenamiento de datos, una tabla de dimensiones tiene una clave principal que identifica de forma única cada registro y otras piezas de información que se conocen como datos dimensionales.

Todos los métodos de actualización para los diferentes tipos de SCD se pueden realizar mediante el programa SortCL en IRI CoSort. En IRI Voracity hay un asistente que ayuda a crear los scripts de trabajo SCD que se usan cuando se ejecuta el programa SortCL. La mayoría de las variaciones utilizan una combinación externa completa para hacer coincidir los registros de la fuente de datos maestra original con los registros de la fuente actualizada en función de la equiparación de una clave de cada uno. Los registros con coincidencias deben actualizarse en el maestro. Los registros en la fuente de actualización que no tienen una coincidencia deben agregarse al maestro.

Aquí hay una descripción general de cómo actualizar un archivo dimensional usando SCD Tipo 3 donde mantengo los costos del producto. La actualización se logra uniendo con respecto al campo ProductCode .

MSC tipo 3

Con el modelo Tipo 3, los datos actuales y los datos históricos se llevan en el mismo registro. Una de las cosas más importantes para decidir es cuánto historial debe conservarse. Con nuestro ejemplo, mantendré un costo para tres fechas de inicio. La fecha de finalización es la fecha en que el costo en el registro ya no es efectivo. Si el costo aún es efectivo, entonces EndDate1 se establecerá en 99991231. Esto es para evitar un valor vacío en este campo. Estos son los valores contenidos en la fuente maestra inicial (master3.dat):

ProductCode Coste1 FechaInicio1 Fecha de finalización 1 Coste2 FechaInicio2 Fecha2 de finalización Coste3 FechaInicio3 FechaFin3
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

Todos los registros de actualización tienen la misma fecha de inicio. La fuente update.dat contiene los siguientes valores de campo para los registros:

ProductCode Coste Fecha de inicio
F112 2425.00 20120701
J245 550,50 20120701
M447 101,75 20120701
S022 101,75 20120701

A continuación se muestran los datos actualizados. Para cada registro que se actualizó, cada costo, fecha de inicio y fecha de finalización se mueve a la derecha un conjunto. En el antiguo grupo actual del registro, la fecha de finalización se cambia por la fecha de inicio del nuevo conjunto actual actualizado. Cualquier valor para el antiguo tercer conjunto se descarta.

ProductCode Coste1 FechaInicio1 Fecha de finalización 1 Coste2 FechaInicio2 Fecha2 de finalización Coste3 FechaInicio3 FechaFin3
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

En IRI Workbench, hay un asistente de Voracity para ayudar en la creación de scripts para actualizar archivos y tablas de Dimensional. Este asistente se encuentra en el menú desplegable Voracidad en la barra de navegación. Primero eliges el tipo SCD. Luego se muestra la ventana donde selecciona los archivos que se utilizan para procesar la actualización.

En la tabla superior de la siguiente pantalla, determina cómo se asignan los datos que se actualizan al maestro. En el grupo central de la pantalla, elija los campos que dan los valores de estado para los registros que se están actualizando.

En los menús desplegables bajo Actual y conjuntos de campos históricos , el primer conjunto que define, proporciona los nombres de campo para los valores actuales. Campo de valor es el valor dimensional que se está actualizando. Campo de inicio es el campo que determina cuándo el Campo de valor se volvió activo y End Field determina cuándo ya no es válido. Luego, defina tantos conjuntos como necesite para la cantidad de valores históricos que se mantienen.

Este es el script de trabajo que actualizará el archivo maestro:

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