Em um Modelo Dimensional, o recurso mais valioso sem sombra de dúvida é uma boa dimensão Data. Ainda que uma estrela (um conjunto fato-dimensões) seja em si mesma um grande recurso analítico, ela é pouco útil se não agregar a capacidade de analisar os dados contra o tempo.

Kimball comenta o seguinte sobre a dimensão Data:

Kimball comenta sobre a dimensão Data.
Kimball comenta sobre a dimensão Data.

A sugestão é simples e muito prática: baixe este arquivo do site dele, copie a coluna com os INSERTs e cole num terminal SQL. Repare que, no comentário acima, ele ainda menciona a necessidade de se criar uma linha extra, com chave especial (zero?) para os fatos que ainda não tem data.

Usando o Pentaho Data Integration

No meu livro Pentaho na Prática há uma outra forma de se popular uma dimensão data, que é usando esta transformação do PDI:

Transformação para popular uma dimensão Data.
Transformação para popular uma dimensão Data.

Ela gera 10.000 linhas, a partir de 1/jan/1990, com dia da semana e mês, em inglês. Se você quiser traduzir, basta editar o conteúdo dos passos Days of week e Months. Porém, da mesma forma que a planilha do Kimball, essa transformação não cuida do registro zero – você deve inseri-lo manualmente.

Clique aqui para baixar o arquivo. Depois de descompactá-lo e abri-lo com o PDI, você precisa configurar apenas o último passo (figura abaixo: selecione uma conexão, informe o esquema se for necessário, e depois inserir o nome da tabela) e clicar no botão SQL para automagicamente criar a tabela.

Passo de saída para a transformação que popula a dimensão data.
Passo de saída para a transformação que popula a dimensão data.

Essa transformação vem na pasta de amostras do PDI 3.8. Infelizmente, as versões posteriores passaram a vir corrompidas.

Anúncios

7 comentários sobre “Como Criar uma Dimensão Data

  1. Olá,

    Desculpe a pergunta de leigo mas eu tenho algumas dúvidas referente a dimensão data como por exemplo.

    Tenho uma dimensão ‘Pessoa’ para utilizar a dimensão data com a data de registro dessa pessoa devo fazer de que maneira? já que a data de registro que tenho em minha base OLTP está com minutos segundos etc.. e na minha dimensão data eu só tenho a data 00:00:00. Ou estou indo pro caminho errado e não devo fazer a comparação dessa maneira?

    Desde já, Obrigado.

    1. Perguntas de leigos são as mais difícieis, hehe. ;-) Fique à vontade. Eu já respondi no outro comentário, mas só para não deixar nada para trás: sua pergunta vai na direção correta. A hora em uma data que vai ser usada para dimensionamento atrapalha, e precisa ser tratada. Porém, em coluna data, dentro de uma dimensão, essa preocupação não faz sentido. Beleza?

  2. Olá,

    Tenho algumas dúvidas referente à como deve ser utilizado a dimensão data.
    Um exemplo, Tenho uma dimensão ‘Pessoa’ e na minha base OLTP tenho a data de registro de cada pessoa. porém a data de registro que eu tenho na base OLTP tenho horas:minutos:segundos e na minha dimensão data eu só tenho 00:00:00 como eu faria para comparar isso? ou estou indo no caminho errado da idéia da dimensão data?

    Desde já, Obrigado.

    1. Você misturou um pouco as coisas. A data em que o empregado foi contratado não tem nada a ver com a dimensão data. A dimensão data serve para analisar os fatos – e não se relaciona com outra dimensão qualquer.

      Agora, se você quer analisar não apenas a data de um evento, mas a hora na qual ele ocorreu, então você precisa incluir a hora (e minutos e segundos) nas suas dimensões. Normalmente fazemos isso criando uma dimensão Hora, à parte. Normalmente não multiplexamos data e hora na mesma tabela porque isso geraria um mundilhão de linhas. Não apenas pioraria em muito a performance, como ocuparia muito espaço (cada dia ocupa 86400 segundos, vezes 365 dias no ano, vezes uns 10 anos, dá 315.360.000 linhas.)

      Finalmente, se você quer analisar a data de contratação do seu empregado, então crie uma fato que cruze a dimensão Empregado, a dim. Data e a dim. Hora.

      Quanto a tratar a hora ao final da data, para dimensionamento, você precisa quebrar o campo (que tem cara de timestamp, que traz data e hora) em dois outros campos e dimensioná-los separadamente.

      Era isso?

      1. Obrigado pela resposta Fábio, tratei as horas/minutos para ficarem 00:00:00 agora e deu certo, mas uma coisa que eu tenho dúvida e já pesquisei muito à respeito e não sei se ficou exatamente claro, é seguinte: “Eu devo comparar a data da minha base de dados OLTP com as datas da dimensão data para pegar a sk_data. correto?” se não, como devo gerar essa sk_data ?

      2. De nada, que bom que tudo funcionou.

        Quanto à sua pergunta, permita-me uma digressão antes: eu apelidei o processo a que você se refere de “dimensionamento”. Dimensionar é trocar a chave natural, que existe no OLTP, pela chave delegada, que existe no DW. Dito isto, a resposta à sua pergunta é sim, você compara a data da transação com a da dimensão data, e recupera o valor da coluna data_sk para inserir na fato. É assim que você popula a data_sk da sua fato. Agora atente para uma coisa: essa data que você traz do OLTP deve ser uma data de um evento – precisa estar relacionada ao que você quer analisar. É diferente de, por exemplo, uma data que entra como atributo de uma outra dimensão – como a data de contratação de um empregado, que vai na dimensão Empregado. (Você nunca deve ligar duas dimensões diretamente! Isso é chamado de sub-dimensionamento e é um erro em modelos dimensionais.)

        Leia o livro do Kimball. Ele explica direitinho isso lá. (Veja na paǵina https://geekbi.wordpress.com/livros/ deste blog.)

      3. Era exatamente isso que eu queria saber.. muito obrigado Fábio, agora tudo ficou mais claro.. Muito obrigado mesmo!

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s