(+351) 21 24 10006  ·  info@bconcepts.pt
Carnaxide, Lisboa

Accumulating snapshot em Modelação Kimball: passo prático

João Barros 19 de July de 2026 4 min de leitura

Um accumulating snapshot em Modelação de Dados (Kimball) regista uma instância de processo (ex.: encomenda) e acompanha o seu ciclo com colunas para eventos principais. É útil para medir tempos de ciclo, identificar estrangulamentos e alimentar relatórios de desempenho do processo.

Pré-requisitos

  • Conhecimentos básicos de SQL (inserts, updates, MERGE).
  • Ambiente SQL Server, Azure SQL, ou similar com suporte a MERGE.
  • Tabelas de dimensão básicas (por exemplo dim_customer, dim_product).

Passo 1: Definir o grain para o Accumulating snapshot em Modelação de Dados (Kimball)

Escolhe exactamente qual a unidade de análise — normalmente "uma encomenda" ou "um processo order-to-cash". O grain define que haverá uma única linha na fact table por instância do processo.

Passo 2: Identificar eventos e medidas essenciais

Lista os eventos que ocorrem ao longo do ciclo e as medidas que queres acompanhar. Exemplo para encomendas: order_date, ship_date, delivery_date, order_amount, days_to_ship, days_to_deliver.

Passo 3: Criar a estrutura da fact table (exemplo SQL)

Criar uma fact table com uma surrogate key, a business key (order_number) e colunas para cada evento. Inclui campos de auditoria para saber quando a linha foi criada/actualizada.

CREATE TABLE fact_order_accumulating (
  fact_order_sk INT IDENTITY(1,1) PRIMARY KEY,
  order_number VARCHAR(50) UNIQUE,
  customer_sk INT,
  product_sk INT,
  order_date DATE,
  ship_date DATE NULL,
  delivery_date DATE NULL,
  order_amount DECIMAL(18,2),
  status VARCHAR(20),
  created_dt DATETIME2 DEFAULT SYSUTCDATETIME(),
  updated_dt DATETIME2
);

Passo 4: Carregar a fact table inicialmente (Load inicial)

Na carga inicial insere uma linha por instância do processo com os eventos disponíveis naquele momento (por exemplo apenas order_date). Mantém order_number como chave natural para identificar a linha única.

INSERT INTO fact_order_accumulating (order_number, customer_sk, product_sk, order_date, order_amount, status)
SELECT o.order_number, c.customer_sk, p.product_sk, o.order_date, o.total_amount, 'Ordered'
FROM staging_orders o
JOIN dim_customer c ON o.customer_id = c.customer_id
JOIN dim_product p ON o.product_id = p.product_id
WHERE NOT EXISTS (
  SELECT 1 FROM fact_order_accumulating f WHERE f.order_number = o.order_number
);

Passo 5: Actualizações incrementais do Accumulating snapshot em Modelação de Dados (Kimball)

Quando ocorrem eventos (por ex. envio ou entrega), actualiza a linha existente em vez de inserir nova. Usa MERGE ou UPDATE para aplicar alterações. A lógica mantém uma linha por processo, preenchendo colunas de eventos à medida que acontecem.

-- Exemplo com MERGE para aplicar novos eventos de envio/entrega
MERGE INTO fact_order_accumulating AS target
USING (
  SELECT order_number, ship_date, delivery_date, event_type
  FROM staging_order_events
) AS src
ON target.order_number = src.order_number
WHEN MATCHED AND src.event_type = 'Shipped' AND (target.ship_date IS NULL) THEN
  UPDATE SET ship_date = src.ship_date,
             status = 'Shipped',
             updated_dt = SYSUTCDATETIME()
WHEN MATCHED AND src.event_type = 'Delivered' AND (target.delivery_date IS NULL) THEN
  UPDATE SET delivery_date = src.delivery_date,
             status = 'Delivered',
             updated_dt = SYSUTCDATETIME();

Passo 6: Calcular medidas derivadas

Depois de as datas estarem preenchidas, podes criar medidas como days_to_ship ou days_to_deliver numa camada de transformação ou no semantic layer (Power BI ou relatório).

-- Exemplos de colunas calculadas numa view
CREATE VIEW vw_fact_order_metrics AS
SELECT *,
  DATEDIFF(day, order_date, ship_date) AS days_to_ship,
  DATEDIFF(day, ship_date, delivery_date) AS days_ship_to_deliver,
  DATEDIFF(day, order_date, delivery_date) AS days_total_cycle
FROM fact_order_accumulating;

Verificar o resultado

Valida que existe apenas uma linha por order_number e que as datas são actualizadas, não substituídas por novas linhas. Exemplos de verificações:

  • Contagem única: SELECT COUNT(*) vs COUNT(DISTINCT order_number).
  • Verificar eventos preenchidos: SELECT * FROM fact_order_accumulating WHERE ship_date IS NULL AND status='Shipped'.
  • Testar a view vw_fact_order_metrics para valores plausíveis (dias negativos indicam problemas de dados).

Conclusão

Um accumulating snapshot em Modelação de Dados (Kimball) simplifica análises de ciclo ao manter uma linha por processo e actualizar eventos ao longo do tempo. Próximos passos: automatizar o ETL (agendar MERGE), lidar com correcções retroactivas e documentar as regras de negócio. Dica: valida sempre a integridade das chaves naturais e trata eventos fora de ordem (timestamps) antes de actualizar a fact table — como lidas com eventos fora de ordem no teu processo?