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

SCD tipo 2

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