Accumulating snapshot em Modelação Kimball: passo prático
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?