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 ""