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

SCD Tipo 6


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