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 los tipos de SCD utilizan una combinación externa completa para hacer coincidir los registros de la fuente de datos original con los registros de la fuente de actualización 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 2 donde mantengo los costos del producto. La actualización se logra uniendo con respecto al campo ProductCode .
MSC tipo 2
En este modelo, los registros actuales e históricos se guardan en el mismo archivo. En una base de datos activa, es probable que tenga una clave sustituta para usar como clave principal para vincular las tablas de hechos además del ProductCode clave que se utiliza para el proceso de actualización. Debido a que los registros actuales y los registros históricos están contenidos en el mismo archivo, es necesario tener un campo que indique si el registro es el registro actual para el ProductCode y necesitamos un campo para indicar cuando el costo del ProductCode ya no es efectivo. En este ejemplo tenemos:
- Código de producto :Este es el campo de la clave del identificador.
- Coste :Costo que entró en vigencia el StartDate para que conste.
- Fecha de inicio :esta es la fecha en que se hizo efectivo el costo del registro.
- Fecha de finalización :Esta es la fecha en que el Coste en el registro ya no es efectivo. Si el Costo sigue vigente, la Fecha de finalización se establecerá en 99991231. Esto es para evitar un valor nulo en este campo.
- Actual :S si el costo aún está vigente, N si no lo está.
La tabla de partida ya tiene 3 registros históricos. Son las que tienen el valor N para el campo Actual . La fuente maestra se llama master2.dat y contiene los siguientes datos:
ProductCode | Coste | Fecha de inicio | Fecha de finalización | Actual |
---|---|---|---|---|
C123 | 125,50 | 20110228 | 99991231 | Y |
F112 | 2365.00 | 20120101 | 99991231 | Y |
G101 | 19,25 | 20110930 | 99991231 | Y |
G101 | 21,25 | 20110501 | 20110930 | N |
J245 | 450,50 | 20110430 | 99991231 | Y |
J245 | 425,25 | 20101001 | 20110430 | N |
J245 | 385,25 | 20100215 | 20101001 | N |
S022 | 98,75 | 20110515 | 99991231 | Y |
Todos los registros de actualización tienen la misma StartDate . La fuente update.dat contiene registros con los siguientes valores de campo:
ProductCode | Coste | Fecha de inicio |
---|---|---|
F112 | 2425.00 | 20120701 |
J245 | 550,50 | 20120701 |
M447 | 101,75 | 20120701 |
S022 | 101,75 | 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 se seleccionan las fuentes que se utilizan para procesar la actualización. Para el Tipo 2, el objetivo es normalmente el archivo o la tabla maestra original.
Con la siguiente pantalla, determina cómo se asignan los datos de actualización y cómo se establecen otros valores de campo o columna. El actualizar.Coste se asignará al Master2.cost y la actualización. Fecha de inicio se asignará a master2.StartDate . El campo de bandera es el campo que se utiliza para determinar el registro con el Costo activo. Es decir, si los valores del registro son activos o históricos. En este caso, el campo de bandera es el campo Actual . El valor positivo de la marca es el valor en Actual que determina si el Coste es el Coste actual; el valor es "Y" en nuestro ejemplo y el Valor negativo de la bandera es "N". El campo final contiene el nombre del campo que contiene el valor utilizado para determinar cuándo el costo del registro ya no es efectivo y Master.EndDate mantiene ese valor. Valor final se utiliza como valor para Campo final cuando el registro contiene los valores actuales para un ProductCode .
La siguiente pantalla es para definir la unión realizada con el maestro y las fuentes de actualización. Debe tener en cuenta que ambas fuentes deben ordenarse con respecto a ProductCode . Si no lo están, debe seleccionar NOT_SORTED en el menú desplegable de Opción de orden de clasificación debajo de la fuente de datos que debe ordenarse.
Aquí está el guión del trabajo:
/INFILE=C:/IRI/CoSort95/workbench.orig/workspace/SCD/SCD2/master2.dat /PROCESS=DELIMITED /ALIAS=master2 /FIELD=(PRODUCTCODE, TYPE=ASCII, POSITION=1, SEPARATOR=",", FRAME='\"') /FIELD=(COST, TYPE=NUMERIC, POSITION=2, SEPARATOR=",", FRAME='\"') /FIELD=(STARTDATE, TYPE=ASCII, POSITION=3, SEPARATOR=",", FRAME='\"') /FIELD=(ENDDATE, TYPE=ASCII, POSITION=4, SEPARATOR=",", FRAME='\"') /FIELD=(CURRENT, TYPE=ASCII, POSITION=5, SEPARATOR=",", FRAME='\"') /INFILE=C:/IRI/CoSort95/workbench.orig/workspace/SCD/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 master2 update WHERE MASTER2.PRODUCTCODE == UPDATE.PRODUCTCODE /OUTFILE=master2.dat # Include only records that are being updated # Use the Cost and StartDate from the Update file /PROCESS=DELIMITED /FIELD=(MASTER2.PRODUCTCODE, TYPE=ASCII, POSITION=1, SEPARATOR=",", FRAME='\"') /FIELD=(UPDATE.COST, TYPE=NUMERIC, POSITION=2, SEPARATOR=",", FRAME='\"') /FIELD=(UPDATE.STARTDATE, TYPE=ASCII, POSITION=3, SEPARATOR=",", FRAME='\"') /FIELD=(MASTER2.ENDDATE, TYPE=ASCII, POSITION=4, SEPARATOR=",", FRAME='\"') /FIELD=(MASTER2.CURRENT, TYPE=ASCII, POSITION=5, SEPARATOR=",", FRAME='\"') /INCLUDE WHERE MASTER2.PRODUCTCODE == UPDATE.PRODUCTCODE AND MASTER2.CURRENT EQ “Y" /OUTFILE=master2.dat # Change any current records that are being updated to history records # by giving the EndDate as the StartDate from the update record # and changing the field Current to N /PROCESS=DELIMITED /CONDITION=(MATCH, TEST=(MASTER2.PRODUCTCODE == UPDATE.PRODUCTCODE AND MASTER2.CURRENT EQ "Y")) /FIELD=(MASTER2.PRODUCTCODE, TYPE=ASCII, POSITION=1, SEPARATOR=",", FRAME='\"') /FIELD=(MASTER2.COST, TYPE=NUMERIC, POSITION=2, SEPARATOR=",", FRAME='\"') /FIELD=(MASTER2.STARTDATE, TYPE=ASCII, POSITION=3, SEPARATOR=",", FRAME='\"') /FIELD=(ENDDATE_NEW, TYPE=ASCII, POSITION=4, SEPARATOR=",", FRAME='\"', IF MATCH THEN UPDATE.STARTDATE ELSE MASTER2.ENDDATE) /FIELD=(CURRENT_NEW, TYPE=ASCII, POSITION=5, SEPARATOR=",", FRAME='\"', IF MATCH THEN "N" ELSE MASTER2.CURRENT) /OMIT WHERE MASTER2.PRODUCTCODE EQ "" /OUTFILE=master2.dat # Add new records /PROCESS=DELIMITED /FIELD=(PRODUCTCODE, TYPE=ASCII, POSITION=1, SEPARATOR=",", FRAME='\"') /FIELD=(UPDATE.COST, TYPE=NUMERIC, POSITION=2, SEPARATOR=",", FRAME='\"') /FIELD=(UPDATE.STARTDATE, TYPE=ASCII, POSITION=3, SEPARATOR=",", FRAME='\"') /FIELD=(ENDDATE_NEW="99991231", TYPE=ASCII, POSITION=4, SEPARATOR=",", FRAME='\"') /FIELD=(CURRENT_NEW="Y", TYPE=ASCII, POSITION=5, SEPARATOR=",", FRAME='\"') /INCLUDE WHERE UPDATE.PRODUCTCODE NE "" AND MASTER2.PRODUCTCODE EQ ""
El nuevo archivo maestro tendrá estos valores:
ProductCode | Coste | Fecha de inicio | Fecha de finalización | Actual |
---|---|---|---|---|
C123 | 125,50 | 20110228 | 99991231 | Y |
F112 | 2425.00 | 20120701 | 99991231 | Y |
F112 | 2365.00 | 20120101 | 20120701 | N |
G101 | 19,25 | 20110930 | 99991231 | Y |
G101 | 21,25 | 20110501 | 20110930 | N |
J245 | 550,50 | 20120701 | 99991231 | Y |
J245 | 450,50 | 20110430 | 20120701 | N |
J245 | 425,25 | 20101001 | 20110430 | N |
J245 | 385,25 | 20100215 | 20101001 | N |
M447 | 101,75 | 20120701 | 99991231 | Y |
S022 | 101,75 | 20120701 | 99991231 | Y |
S022 | 98,75 | 20110515 | 20120701 | N |