Tabelas que só guardam o estado atual
Uma versão por mudança, com início e fim de vigência
O estado de cada entidade em qualquer data
MRR, comissão, carteira, funil e agente de IA
O que resolve
- O número de um mês passado não muda quando o cadastro muda hoje.
- Cada fato é cruzado com o dono, o plano e o status vigentes na data dele.
- O dado que a fonte apaga depois de alguns dias fica guardado.
Perguntas de negócio que responde
Faça estas perguntas ao seu agente quando o caso estiver pronto.
O que você precisa
- As fontes conectadas na Nekt, com o histórico (SCD Type 2) ligado nas tabelas de estado
- A chave de negócio estável de cada entidade
- A lista de campos cuja mudança importa para o negócio
O que você recebe
- Uma tabela de versões por entidade, com início e fim de vigência
- Uma visão só com a versão vigente para o dia a dia
- Fotos de fim de dia ou de fim de mês para as métricas
- Um agente de IA que responde como algo estava em qualquer data
Onde ativar
Movimentos de MRR, contratos ativos e imóveis em pauta calculados pela foto de fim de mês.
Cada venda cruzada com o dono, a equipe e a regra vigentes na data do ganho.
Responde como algo estava em qualquer data e diz desde quando existe histórico.
Ligar o histórico na tabela de origem é configuração. O trabalho está nas fotos de tabelas derivadas, que pedem notebook com merge, e em reconstruir o período anterior a partir de eventos ou faturas. O detalhado traz as regras de negócio, as armadilhas e o teste de aceitação. Ou mande tudo direto para o seu agente com o MCP da Nekt.
A maior parte das fontes devolve só a foto de agora. Quando o cliente muda de plano, de dono ou de status, o valor antigo é sobrescrito e todo relatório do passado passa a usar o valor novo. Numa base real, mudar o segmento, o executivo ou o valor mensal de uma empresa reescrevia todas as vendas antigas dela. Outras fontes só guardam 30 ou 45 dias, e a cada sincronização completa o passado encolhe.
Como costuma ser feito, e a regra
Cada linha é um erro que já aconteceu na prática.
Na Nekt, ative o SCD Type 2 na tabela de origem. Cada mudança vira uma linha nova com _available_from (início da vigência), _available_until (fim, nulo na versão vigente) e _deleted. O histórico vale a partir do dia em que foi ligado: a primeira versão de cada entidade é o estado naquele dia, não na criação.
Cada versão pode ganhar um código substituto novo. Numa dimensão versionada de corretora, os códigos mudavam a cada versão da mesma conta. Identifique a entidade pela chave de negócio estável (id da assinatura, código da conta, id do negócio) e use o código substituto só para ligar o fato à versão daquela data.
O estado numa data é a versão em que _available_from é menor ou igual à data e _available_until é nulo ou maior que ela. Para cruzar um fato com uma dimensão (o assessor da captação, o dono do negócio ganho, o plano da fatura), use a data do fato, não a versão de hoje.
Para o dia a dia, publique uma visão só com a versão vigente (_available_until nulo e _deleted falso) e mantenha a linha do tempo completa numa tabela à parte. Quem consulta a tabela de versões sem filtro conta cada entidade várias vezes.
_available_from e _available_until são instantes em UTC. Converta para o fuso do negócio (America/Sao_Paulo) antes de cortar o dia ou o mês, senão mudanças feitas à noite caem no dia seguinte e a foto de fim de mês pega a versão errada.
O SCD grava uma versão por sincronização que encontrou mudança, então a mesma entidade pode ter várias versões no mesmo dia. Na foto diária, use a última versão de cada entidade em cada dia. Na foto de fim de mês, use a versão vigente no último instante do mês, com o mesmo corte para todas as entidades.
Uma versão nova pode ter mudado só o período de cobrança, a última fatura ou outro campo técnico. Para contar mudanças de status, de dono ou de plano, compare o campo com o da versão anterior. Colunas de controle como _nekt_sync_at nunca entram na comparação, e _available_from diz quando a sincronização viu a mudança, não quando ela aconteceu na fonte.
Algumas APIs guardam poucos dias: eventos do Stripe por cerca de 30, analytics de e-mail por cerca de 45, coleções com TTL no banco. A sincronização completa reescreve a tabela com a janela vigente e apaga o resto. Acumule numa tabela própria por merge, com chave e dia, que só cresce, e nunca troque esse merge por overwrite.
Uma transformação SQL reconstrói a tabela inteira a cada execução e não guarda passado. Para fotografar um número calculado (carteira, saldo, MRR do dia), use um notebook que lê a própria saída, mantém os dias anteriores e substitui só o dia atual. Assim, rodar duas vezes no mesmo dia não duplica a foto.
O resultado de um mês fechado é lido da foto congelada, não recalculado com a regra ou o cadastro de hoje. Correções posteriores entram como ajuste no mês em que foram descobertas. Numa base real, uma qualificação recalculada a cada execução fez o número de um mês encolher depois de apresentado.
Que tipo de tabela responde a pergunta
Classifique a fonte antes de responder qualquer coisa sobre o tempo.
Definições
Armadilhas que já aconteceram
Uma foto diária foi sobrescrita por engano e quase três semanas de histórico tiveram de ser reconstruídas.
Ponha uma guarda antes de gravar: recuse saída vazia e aborte se algum dia já gravado desaparecer.
A sincronização completa de uma fonte de analytics reescreveu a tabela com a janela vigente e apagou mais da metade das linhas de uma vez.
Acumule numa tabela própria por merge e nunca use a tabela bruta como arquivo.
Uma dimensão versionada vinda de um parceiro tinha contas sem nenhuma versão marcada como vigente, uma delas com dezenas de versões.
Teste uma versão vigente por entidade todos os dias e use o intervalo de datas, não a flag de vigente da fonte.
A comissão cruzava negócios ganhos em meses passados com o responsável atual, e quem trocou de carteira levava vendas que não fez.
Cruze pelo responsável vigente na data do ganho.
A primeira versão de cada entidade era a do dia em que o histórico foi ligado. Lida como se valesse desde a criação, ela atribuía o segmento e o plano de hoje a vendas antigas.
Registre o início do histórico e reconstrua o período anterior por eventos, faturas ou histórico de etapa.
Um backfill gravou atributos de contrato com a data da carga e contaminou o cálculo de expansão dos meses anteriores.
Marque as linhas de backfill e nunca use a data da carga como data do negócio.
Teste de aceitação
O caso está pronto quando todos os itens passam.
- Cada entidade não excluída tem exatamente uma versão com _available_until nulo.
- Os intervalos de cada entidade são contínuos: o fim de uma versão é o início da seguinte, sem buraco nem sobreposição.
- A visão vigente tem o mesmo número de entidades e os mesmos valores que o cadastro atual da fonte.
- Rodar o pipeline de novo não altera a foto de nenhum mês fechado.
- Rodar a foto diária duas vezes no mesmo dia não cria linha nova.
Pacote para o agente
Cole no Claude, ChatGPT ou outro cliente com o MCP da Nekt conectado.
Histórico e datas - Antes de responder sobre o tempo, classifique a tabela: cadastro atual, versões (SCD Type 2), foto diária, foto mensal, histórico de eventos ou última observação conhecida. Não chame cadastro atual de histórico. - Tabelas com SCD Type 2 têm _available_from, _available_until e _deleted. Versão vigente: _available_until nulo e _deleted falso. - Estado numa data: _available_from <= data e (_available_until nulo ou > data). Converta de UTC para America/Sao_Paulo antes de cortar dia ou mês. - Cruze cada fato com a versão vigente na data do fato (dono, plano, status, segmento), nunca com a de hoje. - A entidade é a chave de negócio. Códigos substitutos mudam a cada versão. - Versão nova não é mudança de status: compare o campo com a versão anterior. - _nekt_sync_at e _available_from não são data do negócio. Use a data do evento. - O histórico começa no menor _available_from da tabela. Antes disso, diga que não há histórico ou use a fonte de eventos indicada. - Meses fechados vêm da foto congelada. Não recalcule com o cadastro atual. Exceções por cliente: - <cliente>: histórico de <tabela> ligado em <data>; antes disso, usar <tabela de eventos>. - <cliente>: foto de fim de mês com corte às <hora> do último dia útil.
Construa no meu workspace Nekt o caso "Histórico com SCD Type 2" seguindo as regras em https://academy.nekt.com/casos/scd-type-2.md. 1) Encontre as tabelas de origem e confirme as colunas usadas pelas regras. 2) Crie uma transformação no grão indicado aplicando todas as regras. 3) Rode o teste de aceitação e me mostre o resultado de cada item. 4) Crie o context document do caso no workspace, com as exceções dos meus clientes em aberto para eu preencher.
Variações
Quando a fonte guarda histórico (propertieswithhistory do HubSpot, stage_history do Bitrix24, log de eventos), use-o para o período anterior ao SCD.
Para números calculados (saldo bancário, estoque, carteira), uma foto diária por merge, com retenção definida.
Para CRMs sem histórico de etapa, um webhook grava cada mudança como evento, com o valor de antes e o de depois.