Accumulating snapshot en Modelado Kimball: paso práctico
Un accumulating snapshot en Modelado de Datos (Kimball) registra una instancia de proceso (p.ej.: pedido) y acompaña su ciclo con columnas para eventos principales. Es útil para medir tiempos de ciclo, identificar cuellos de botella y alimentar informes de rendimiento del proceso.
Requisitos previos
- Conocimientos básicos de SQL (inserts, updates, MERGE).
- Entorno SQL Server, Azure SQL, o similar con soporte para MERGE.
- Tablas de dimensión básicas (por ejemplo dim_customer, dim_product).
Paso 1: Definir el grain para el Accumulating snapshot en Modelado de Datos (Kimball)
Elige exactamente cuál es la unidad de análisis — normalmente "un pedido" o "un proceso order-to-cash". El grain define que habrá una única fila en la fact table por instancia del proceso.
Paso 2: Identificar eventos y medidas esenciales
Lista los eventos que ocurren a lo largo del ciclo y las medidas que quieres acompañar. Ejemplo para pedidos: order_date, ship_date, delivery_date, order_amount, days_to_ship, days_to_deliver.
Paso 3: Crear la estructura de la fact table (ejemplo SQL)
Crear una fact table con una surrogate key, la business key (order_number) y columnas para cada evento. Incluye campos de auditoría para saber cuándo se creó/actualizó la fila.
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
);
Paso 4: Cargar la fact table inicialmente (Load inicial)
En la carga inicial inserta una fila por instancia del proceso con los eventos disponibles en ese momento (por ejemplo solo order_date). Mantén order_number como clave natural para identificar la fila ú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
);
Paso 5: Actualizaciones incrementales del Accumulating snapshot en Modelado de Datos (Kimball)
Cuando ocurren eventos (p.ej. envío o entrega), actualiza la fila existente en lugar de insertar una nueva. Usa MERGE o UPDATE para aplicar cambios. La lógica mantiene una fila por proceso, rellenando columnas de eventos a medida que ocurren.
-- Exemplo con MERGE para aplicar nuevos eventos de envío/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();
Paso 6: Calcular medidas derivadas
Después de que las fechas estén rellenas, puedes crear medidas como days_to_ship o days_to_deliver en una capa de transformación o en el semantic layer (Power BI o informe).
-- Ejemplos de columnas calculadas en una 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 el resultado
Valida que existe solo una fila por order_number y que las fechas se actualizan, no se sustituyen por nuevas filas. Ejemplos de verificaciones:
- Conteo único: SELECT COUNT(*) vs COUNT(DISTINCT order_number).
- Verificar eventos rellenados: SELECT * FROM fact_order_accumulating WHERE ship_date IS NULL AND status='Shipped'.
- Probar la view vw_fact_order_metrics para valores plausibles (días negativos indican problemas de datos).
Conclusión
Un accumulating snapshot en Modelado de Datos (Kimball) simplifica los análisis de ciclo al mantener una fila por proceso y actualizar eventos a lo largo del tiempo. Próximos pasos: automatizar el ETL (programar MERGE), gestionar correcciones retroactivas y documentar las reglas de negocio. Consejo: valida siempre la integridad de las claves naturales y trata eventos fuera de orden (timestamps) antes de actualizar la fact table — ¿cómo gestionas eventos fuera de orden en tu proceso?