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

SCD Tipo 3


Dados dimensionais que mudam lentamente ou de forma 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 das variações usa uma junção externa completa para corresponder registros da fonte de dados mestre original com registros na fonte atualizada com base na igualdade de uma chave de cada uma. 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 3 onde estou mantendo os custos do produto. A atualização é realizada juntando-se em relação ao campo ProductCode .

SCD Tipo 3

Com o modelo Tipo 3, os dados atuais e os dados históricos são transportados no mesmo registro. Uma das principais coisas a decidir é quanta história deve ser mantida. Com nosso exemplo, manterei um custo para três datas de início. Data de término é a data em que o custo no registro não está mais em vigor. Se o custo ainda for efetivo, o EndDate1 campo será definido como 99991231. Isso é para evitar um valor vazio neste campo. Aqui estão os valores contidos na fonte mestre inicial (master3.dat):
ProductCode Custo1 DataInício1 EndDate1 Custo2 DataInício2 EndDate2 Custo3 DataInício3 EndDate3
C123 125,50 20110228 99991231
F112 2365,00 20120101 99991231
G101 19,25 20110930 99991231 21.25 20110501 20110930
J245 450,50 20110430 99991231 425,25 20101001 20110430 385,25 20100215 20101001
S022 98,75 20110515 99991231

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

Segue abaixo os dados atualizados. Para cada registro que foi atualizado, cada custo, data de início e data de término é movido para a direita em um conjunto. No grupo atual antigo do registro, a data final é alterada para a data inicial do novo conjunto atual atualizado. Quaisquer valores para o terceiro conjunto antigo são descartados.
ProductCode Custo1 DataInício1 EndDate1 Custo2 DataInício2 EndDate2 Custo3 DataInício3 EndDate3
C123 125,50 20110228 9991231
F112 2.425,00 20120701 9991231 2365,00 20120101 20120701
G101 19,25 20110930 9991231 21.25 20110501 20110930
J245 550,50 20120701 9991231 450,50 20110430 20120701 425,25 20101001 20110430
M447 101,75 20120701 9991231
S022 101,75 20120701 9991231 98,75 20110515 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 os arquivos que são usados ​​para processar a atualização é exibida.



Na tabela superior da próxima tela, você determina como os dados que estão sendo atualizados são mapeados para o mestre. No agrupamento central da tela, escolha os campos que fornecem os valores de status dos registros que estão sendo atualizados.

Nas listas suspensas em Atual e Conjuntos de campos históricos , o primeiro conjunto que você define, fornece os nomes dos campos para os valores atuais. Campo de valor é o valor dimensional que está sendo atualizado. Campo de início é o campo que determina quando o Campo de valor tornou-se ativo e Finalizar campo determina quando não é mais válido. Em seguida, defina quantos conjuntos forem necessários para o número de valores históricos que estão sendo mantidos.



Aqui está o script de trabalho que atualizará o arquivo mestre:
/INFILE=master3.dat
    /PROCESS=DELIMITED
    /ALIAS=master3
    /FIELD=(PRODUCTCODE, TYPE=ASCII, POSITION=1, SEPARATOR=",")
    /FIELD=(COST1, TYPE=NUMERIC, POSITION=2, SEPARATOR=",")
    /FIELD=(STARTDATE1, TYPE=ASCII, POSITION=3, SEPARATOR=",")
    /FIELD=(ENDDATE1, TYPE=ASCII, POSITION=4, SEPARATOR=",")
    /FIELD=(COST2, TYPE=NUMERIC, POSITION=5, SEPARATOR=",")
    /FIELD=(STARTDATE2, TYPE=ASCII, POSITION=6, SEPARATOR=",")
    /FIELD=(ENDDATE2, TYPE=ASCII, POSITION=7, SEPARATOR=",")
    /FIELD=(COST3, TYPE=NUMERIC, POSITION=8, SEPARATOR=",")
    /FIELD=(STARTDATE3, TYPE=ASCII, POSITION=9, SEPARATOR=",")
    /FIELD=(ENDATE3, TYPE=ASCII, POSITION=10, SEPARATOR=",")
/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 master3 update WHERE MASTER3.PRODUCTCODE == UPDATE.PRODUCTCODE

/OUTFILE=master3.dat
# Include only records that are to be updated
    /PROCESS=DELIMITED
    /FIELD=(UPDATE.PRODUCTCODE, TYPE=ASCII, POSITION=1, SEPARATOR=",")
    /FIELD=(UPDATE.COST, TYPE=NUMERIC, POSITION=2, SEPARATOR=",")
    /FIELD=(UPDATE.STARTDATE, TYPE=ASCII, POSITION=3, SEPARATOR=",")
    /FIELD=(ENDDATE1_NEW="99991231", TYPE=ASCII, POSITION=4, SEPARATOR=",")
    /FIELD=(MASTER3.COST1, TYPE=NUMERIC, POSITION=5, SEPARATOR=",")
    /FIELD=(MASTER3.STARTDATE1, TYPE=ASCII, POSITION=6, SEPARATOR=",")
    /FIELD=(UPDATE.STARTDATE, TYPE=ASCII, POSITION=7, SEPARATOR=",")
    /FIELD=(MASTER3.COST3, TYPE=NUMERIC, POSITION=8, SEPARATOR=",")
    /FIELD=(MASTER3.STARTDATE3, TYPE=ASCII, POSITION=9, SEPARATOR=",")
    /FIELD=(MASTER3.ENDATE3, TYPE=ASCII, POSITION=10, SEPARATOR=",")
    /INCLUDE WHERE MASTER3.PRODUCTCODE == UPDATE.PRODUCTCODE

/OUTFILE=master3.dat
# Include only records that are not to be updated
    /PROCESS=DELIMITED
    /FIELD=(MASTER3.PRODUCTCODE, TYPE=ASCII, POSITION=1, SEPARATOR=",")
    /FIELD=(MASTER3.COST1, TYPE=NUMERIC, POSITION=2, SEPARATOR=",")
    /FIELD=(MASTER3.STARTDATE1, TYPE=ASCII, POSITION=3, SEPARATOR=",")
    /FIELD=(MASTER3.ENDDATE1, TYPE=ASCII, POSITION=4, SEPARATOR=",")
    /FIELD=(MASTER3.COST2, TYPE=NUMERIC, POSITION=5, SEPARATOR=",")
    /FIELD=(MASTER3.STARTDATE2, TYPE=ASCII, POSITION=6, SEPARATOR=",")
    /FIELD=(MASTER3.ENDDATE2, TYPE=ASCII, POSITION=7, SEPARATOR=",")
    /FIELD=(MASTER3.COST3, TYPE=NUMERIC, POSITION=8, SEPARATOR=",")
    /FIELD=(MASTER3.STARTDATE3, TYPE=ASCII, POSITION=9, SEPARATOR=",")
    /FIELD=(MASTER3.ENDATE3, TYPE=ASCII, POSITION=10, SEPARATOR=",")
    /OMIT WHERE MASTER3.PRODUCTCODE == UPDATE.PRODUCTCODE
    /OMIT WHERE MASTER3.PRODUCTCODE EQ ""
/OUTFILE=C:/IRI/CoSort95/workbench.orig/workspace/SCD/SCD3/master3.dat
# Add new records
    /PROCESS=DELIMITED
    /FIELD=(UPDATE.PRODUCTCODE, TYPE=ASCII, POSITION=1, SEPARATOR=",")
    /FIELD=(UPDATE.COST, TYPE=NUMERIC, POSITION=2, SEPARATOR=",")
    /FIELD=(UPDATE.STARTDATE, TYPE=ASCII, POSITION=3, SEPARATOR=",")
    /FIELD=(ENDDATE1_NEW="99991231", TYPE=ASCII, POSITION=4, SEPARATOR=",")
    /INCLUDE WHERE MASTER3.PRODUCTCODE EQ "" AND UPDATE.PRODUCTCODE NE ""