Database
 sql >> Base de Dados >  >> RDS >> Database

SCD Tipo 2


Os dados dimensionais que mudam de forma lenta ou imprevisível são capturados em análises de Dimensões de Alteração Lenta (SCD). Em um ambiente de data warehouse, uma tabela de dimensões tem uma chave primária que identifica exclusivamente cada registro e outras informações conhecidas como dados dimensionais.

Todos os métodos de atualização para os diferentes tipos de SCD podem ser realizados usando o programa SortCL no IRI CoSort. No IRI Voracity existe um assistente para auxiliar na criação dos scripts de trabalho SCD usados ​​ao executar o programa SortCL. A maioria dos tipos de SCD usa uma junção externa completa para corresponder registros da fonte de dados original com registros na fonte de atualização com base na igualdade de uma chave de cada um. Os registros com correspondências precisam ser atualizados no mestre. Os registros na fonte de atualização que não têm uma correspondência precisam ser adicionados ao mestre.

Aqui está uma visão geral de como atualizar um arquivo dimensional usando SCD Tipo 2 onde estou mantendo os custos do produto. A atualização é realizada juntando-se em relação ao campo ProductCode .

SCD Tipo 2

Neste modelo, os registros atuais e históricos são mantidos no mesmo arquivo. Em um banco de dados ativo, você provavelmente teria uma chave substituta para usar como chave primária para vincular as tabelas de fatos, além do ProductCode chave que é usada para o processo de atualização. Como os registros atuais e os registros históricos estão contidos no mesmo arquivo, é necessário ter um campo que indique se o registro é o registro atual para o ProductCode e precisamos de um campo para indicar quando o custo do ProductCode não é mais eficaz. Neste exemplo temos:
  • Código do Produto :este é o campo-chave do identificador.
  • Custo :Custo que entrou em vigor em StartDate para o registro.
  • Data de início :esta é a data em que o custo do registro entrou em vigor.
  • Data de término :Esta é a data em que o Custo no registro não é mais eficaz. Se o custo ainda estiver em vigor, o EndDate será definido como 99991231. Isso é para evitar um valor nulo neste campo.
  • Atual :S se o custo ainda estiver em vigor, N se não estiver.

A tabela inicial já possui 3 registros de histórico. São os que possuem o valor N para o campo Atual . A fonte mestre é chamada master2.dat e contém os dados abaixo:
ProductCode Custo Data de início Data de término Atual
C123 125,50 20110228 99991231 S
F112 2365,00 20120101 99991231 S
G101 19,25 20110930 99991231 S
G101 21.25 20110501 20110930 N
J245 450,50 20110430 99991231 S
J245 425,25 20101001 20110430 N
J245 385,25 20100215 20101001 N
S022 98,75 20110515 99991231 S

Todos os registros de atualização têm a mesma StartDate . A fonte update.dat contém registros com os seguintes valores de campo:
ProductCode Custo Data de início
F112 2.425,00 20120701
J245 550,50 20120701
M447 101,75 20120701
S022 101,75 20120701

No IRI Workbench, existe um assistente Voracity para auxiliar na criação de scripts para atualização de arquivos e tabelas Dimensionais. Este assistente está localizado no menu suspenso Voracity na barra de navegação. Primeiro você escolhe o tipo de SCD. Em seguida, a janela onde você seleciona as fontes que são usadas para processar a atualização é exibida. Para o Tipo 2, o destino normalmente é o arquivo ou tabela mestre original.



Na próxima tela, você determina como os dados de atualização são mapeados e como outros valores de campo ou coluna são definidos. O atualização.Custo mapeará para o Master2.cost e a atualização. Data de início mapeará para o master2.StartDate . O Campo de Sinalização é o campo que é usado para determinar o registro com o Custo ativo. Ou seja, se os valores no registro são ativos ou históricos. Nesse caso, o Campo de sinalização é o campo Atual . O Valor Positivo da Sinalização é o valor em Atual que determina se o Custo é o Custo atual; o valor é "Y" em nosso exemplo e o Sinalizar valor negativo é “N”. Campo Final contém o nome do campo que contém o valor usado para determinar quando o Custo do registro não está mais em vigor e Master.EndDate detém esse valor. Valor final é usado como o valor para Campo final quando o registro contém os valores atuais para um ProductCode .



A próxima tela é para definir a junção realizada com as fontes mestre e de atualização. Você deve observar que ambas as fontes devem ser solicitadas em relação ao ProductCode . Se não forem, você precisará selecionar NOT_SORTED na lista suspensa para Opção de ordem de classificação na fonte de dados que precisa ser classificada.







Aqui está o roteiro de trabalho:
/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 ""

O novo arquivo mestre terá estes valores:
ProductCode Custo Data de início Data de término Atual
C123 125,50 20110228 99991231 S
F112 2.425,00 20120701 99991231 S
F112 2365,00 20120101 20120701 N
G101 19,25 20110930 99991231 S
G101 21.25 20110501 20110930 N
J245 550,50 20120701 99991231 S
J245 450,50 20110430 20120701 N
J245 425,25 20101001 20110430 N
J245 385,25 20100215 20101001 N
M447 101,75 20120701 99991231 S
S022 101,75 20120701 99991231 S
S022 98,75 20110515 20120701 N