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

SCD Tipo 6

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