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 das variações usa uma junção externa completa para corresponder registros da fonte de dados original com registros na fonte atualizada com base na igualdade de uma chave de cada uma. 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 ou tabela dimensional usando o SCD Tipo 6, onde estou mantendo os custos do produto. A atualização é realizada juntando-se em relação ao campo ProductCode .
SCD Tipo 6
O Tipo 6 é um híbrido que é uma combinação do Tipo 1, Tipo 2 e Tipo 3. É chamado Tipo 6 porque 1+2+3=6. Cada registro terá terá os seguintes campos:
- Código do Produto : Este é o campo-chave do identificador.
- Custo :custo atual do produto.
- Custo Histórico :custo que entrou em vigor na StartDate para esse registro.
- Data de início :data em que o HistoricalCost entrou em vigor.
- Data de término :Data em que o HistoricalCost do registro não era mais o CurrentCost atual. Se HistoricalCost ainda for o Cost atual, EndDate será 99991231.
- Atual :S se o custo ainda for atual, N se não for
Por enquanto, vamos apenas ver os registros de ProductCode J245. Vamos começar quando o Custo Histórico mais antigo era o Custo atual. O Custo Histórico é o mesmo que o Custo. Existe então um registro para o ProductCode J245 e tem os valores mostrados abaixo:
ProductCode | Custo | Custo Histórico | Data de início | Data de término | Atual |
---|---|---|---|---|---|
J245 | 385,25 | 385,25 | 20100215 | 99991231 | S |
Quando um novo Custo precisa ser implementado, os valores no registro de atualização são usados para adicionar um novo registro atual. O Custo atual em todos os registros com o Código do Produto J245 será alterado para o Custo valor do registro de atualização enquanto o HistoricalCost permanece o mesmo para os registros existentes. Além disso, a EndDate para o registro atual antigo é alterado para StartDate para o novo recorde atual. Nos registros com ProductCode J245, o Custo atual campo no arquivo mestre atualizado agora tem os valores abaixo:
ProductCode | Custo | Custo Histórico | Data de início | Data de término | Atual |
---|---|---|---|---|---|
J245 | 425,25 | 425,25 | 20101001 | 99991231 | S |
J245 | 425,25 | 385,25 | 20100215 | 20101001 | N |
Agora vamos atualizar com o próximo novo custo e obter os seguintes valores para os registros J245:
ProductCode | Custo | Custo Histórico | Data de início | Data de término | Atual |
---|---|---|---|---|---|
J245 | 450,50 | 450,50 | 20110430 | 99991231 | S |
J245 | 450,50 | 425,25 | 20101001 | 20110430 | N |
J245 | 450,50 | 385,25 | 20100215 | 20101001 | N |
A atualização final cria registros que possuem estes valores:
ProductCode | Custo | Custo Histórico | Data de início | Data de término | Atual |
---|---|---|---|---|---|
J245 | 550,50 | 550,50 | 20120701 | 99991231 | S |
J245 | 550,50 | 450,50 | 20110430 | 20120701 | N |
J245 | 550,50 | 425,25 | 20101001 | 20110430 | N |
J245 | 550,50 | 385,25 | 20100215 | 20101001 | N |
Aqui estão os valores no arquivo mestre antes da atualização:
ProductCode | Custo | Custo Histórico | Data de início | Data de término | Atual |
---|---|---|---|---|---|
C123 | 125,50 | 125,50 | 20110228 | 99991231 | S |
F112 | 2365,00 | 2365,00 | 20120101 | 99991231 | S |
G101 | 19,25 | 19,25 | 20110930 | 99991231 | S |
G101 | 19,25 | 21.25 | 20110501 | 20110930 | N |
J245 | 450,50 | 450,50 | 20110430 | 99991231 | S |
J245 | 450,50 | 425,25 | 20101001 | 20110430 | N |
J245 | 450,50 | 385,25 | 20100215 | 20101001 | N |
S022 | 98,75 | 98,75 | 20110515 | 99991231 | S |
Todos os dados de atualização terão a mesma StartDate . A fonte update.dat contém os seguintes valores:
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 6, 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 campo será mapeado para master6.CurrentCost e a update.StartDate campo será mapeado para master6.StartDate . O Campo de Sinalização é o campo usado para determinar se o registro contém os valores de campo mais recentes. Nesse caso, esse campo é master6.current . Se for o registro mais atual, então o CurrentCost campo e o Custo Histórico campo terá os mesmos valores. O Valor Positivo da Sinalização é o valor em master6.Current que determina que os valores do campo são os valores mais recentes para um ProductCode . Quando for esse o caso, o valor é "Y" em nosso exemplo e o Sinalizar valor negativo é “N”. Finalizar campo 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 é atual.
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 primeiro script de trabalho:
/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
Rever,
- O valor de CurrentCost será o mesmo para todos os registros que tenham um ProductCode comum
- Data de início é a data em que o Custo Histórico tornou-se eficaz
- Para o registro mais atual de um ProductCode,
- os valores para CurrentCost e Custo Histórico são iguais
- a Data de término é 99991231
- O valor em Atual é Y
- Para os registros que não são o registro atual
- Data de término é a data em que o próximo Custo mais recente tornou-se eficaz
- O campo Atual tem N para o valor
O novo arquivo mestre não será classificado porque os novos registros mestre atuais foram adicionados à parte inferior do arquivo mestre que terá valores como este:
ProductCode | Custo | Custo Histórico | Data de início | Data de término | Atual |
---|---|---|---|---|---|
C123 | 125,50 | 125,50 | 20110228 | 99991231 | S |
F112 | 2.425,00 | 2365,00 | 20120101 | 20120701 | N |
G101 | 19,25 | 19,25 | 20110930 | 99991231 | S |
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 | 2.425,00 | 2.425,00 | 20120701 | 99991231 | S |
J245 | 550,50 | 550,50 | 20120701 | 99991231 | S |
M447 | 139,25 | 139,25 | 20120701 | 99991231 | S |
S022 | 101,75 | 101,75 | 20120701 | 99991231 | S |