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 unión externa completa para hacer coincidir los registros de la fuente de datos original con los registros de la fuente actualizada en función de la equiparación de una clave de cada uno. 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 o tabla dimensional usando SCD Tipo 6 donde mantengo los costos del producto. La actualización se logra uniendo con respecto al campo ProductCode .
MSC tipo 6
El tipo 6 es un híbrido que es una combinación de tipo 1, tipo 2 y tipo 3. Se llama tipo 6 porque 1+2+3=6. Cada registro tendrá los siguientes campos:
- Código de producto : Este es el campo de clave del identificador.
- Coste :Costo actual del producto.
- Coste histórico :Costo que se hizo efectivo en la Fecha de inicio para ese registro.
- Fecha de inicio :Fecha en la que el Costo Histórico entró en vigencia.
- Fecha de finalización :Fecha en la que el Costo Histórico del registro dejó de ser el Costo Actual actual. Si el Costo histórico sigue siendo el Costo actual, la Fecha de finalización es 99991231.
- Actual :Y si el Costo sigue siendo actual, N si no lo es
Por ahora, veamos los registros de ProductCode J245. Comencemos cuando el primer Coste histórico era el costo actual. El Costo Histórico es el mismo que el Costo. Entonces hay un registro para ProductCode J245 y tiene los valores que se muestran a continuación:
ProductCode | Coste | Coste histórico | Fecha de inicio | Fecha de finalización | Actual |
---|---|---|---|---|---|
J245 | 385,25 | 385,25 | 20100215 | 99991231 | Y |
Cuando es necesario implementar un nuevo costo, los valores en el registro de actualización se utilizan para agregar un nuevo registro actual. El costo actual en todos los registros con el Código de Producto J245 se cambiará a Costo valor del registro de actualización mientras que el Coste histórico permanece igual para los registros existentes. Además, la EndDate para el antiguo registro actual se cambia a StartDate para el nuevo récord actual. En los registros con ProductCode J245, el Coste actual El campo en el archivo maestro actualizado ahora tiene los siguientes valores:
ProductCode | Coste | Coste histórico | Fecha de inicio | Fecha de finalización | Actual |
---|---|---|---|---|---|
J245 | 425,25 | 425,25 | 20101001 | 99991231 | Y |
J245 | 425,25 | 385,25 | 20100215 | 20101001 | N |
Ahora actualizaremos con el próximo costo nuevo y obtendremos los siguientes valores para los registros J245:
ProductCode | Coste | Coste histórico | Fecha de inicio | Fecha de finalización | Actual |
---|---|---|---|---|---|
J245 | 450,50 | 450,50 | 20110430 | 99991231 | Y |
J245 | 450,50 | 425,25 | 20101001 | 20110430 | N |
J245 | 450,50 | 385,25 | 20100215 | 20101001 | N |
La actualización final crea registros que tienen estos valores:
ProductCode | Coste | Coste histórico | Fecha de inicio | Fecha de finalización | Actual |
---|---|---|---|---|---|
J245 | 550,50 | 550,50 | 20120701 | 99991231 | Y |
J245 | 550,50 | 450,50 | 20110430 | 20120701 | N |
J245 | 550,50 | 425,25 | 20101001 | 20110430 | N |
J245 | 550,50 | 385,25 | 20100215 | 20101001 | N |
Estos son los valores en el archivo maestro antes de la actualización:
ProductCode | Coste | Coste histórico | Fecha de inicio | Fecha de finalización | Actual |
---|---|---|---|---|---|
C123 | 125,50 | 125,50 | 20110228 | 99991231 | Y |
F112 | 2365.00 | 2365.00 | 20120101 | 99991231 | Y |
G101 | 19,25 | 19,25 | 20110930 | 99991231 | Y |
G101 | 19,25 | 21,25 | 20110501 | 20110930 | N |
J245 | 450,50 | 450,50 | 20110430 | 99991231 | Y |
J245 | 450,50 | 425,25 | 20101001 | 20110430 | N |
J245 | 450,50 | 385,25 | 20100215 | 20101001 | N |
S022 | 98,75 | 98,75 | 20110515 | 99991231 | Y |
Todos los datos de actualización tendrán la misma StartDate . La fuente update.dat contiene los siguientes valores:
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 6, el destino 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 el campo se asignará a master6.CurrentCost y la actualización.StartDate el campo se asignará a master6.StartDate . El campo de bandera es el campo que se utiliza para determinar si el registro contiene los valores de campo más recientes. En este caso, ese campo es master6.current . Si es el registro más actual, entonces el CurrentCost campo y el HistoryCost campo tendrá los mismos valores. El valor positivo de la marca es el valor en master6.Current que determina que los valores de campo son los valores más recientes para un ProductCode . Cuando ese es el caso, el valor es "Y" en nuestro ejemplo y el Marcar valor negativo es "N". 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 es actual.
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 es así, 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 primer script de trabajo:
/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
Para revisar,
- El valor de CurrentCost será el mismo para todos los registros que tengan un ProductCode común
- Fecha de inicio es la fecha en que el Coste histórico entró en vigor
- Para obtener el registro más actual de un ProductCode,
- los valores para CurrentCost y Coste histórico son iguales
- la fecha de finalización es 99991231
- El valor en Actual es Y
- Para los registros que no son el registro actual
- Fecha de finalización es la fecha en que el siguiente Coste más reciente entró en vigor
- El campo Actual tiene N para el valor
El nuevo archivo maestro no se ordenará porque los nuevos registros maestros actuales se agregaron al final del archivo maestro, que tendrá valores como este:
ProductCode | Coste | Coste histórico | Fecha de inicio | Fecha de finalización | Actual |
---|---|---|---|---|---|
C123 | 125,50 | 125,50 | 20110228 | 99991231 | Y |
F112 | 2425.00 | 2365.00 | 20120101 | 20120701 | N |
G101 | 19,25 | 19,25 | 20110930 | 99991231 | Y |
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 | Y |
J245 | 550,50 | 550,50 | 20120701 | 99991231 | Y |
M447 | 139,25 | 139,25 | 20120701 | 99991231 | Y |
S022 | 101,75 | 101,75 | 20120701 | 99991231 | Y |