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

Accumulating snapshot en Modelado Kimball: paso práctico

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

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?