(+351) 21 24 10006  ·  info@bconcepts.pt
Carnaxide, Lisboa
Modelação de Dados (Kimball)
Modelação de Dados (Kimball) 2 min

Slowly Changing Dimensions Tipo 2: preservar el histórico en el data warehouse

João Barros 20 de March de 2025 2 min de lectura

Las Slowly Changing Dimensions (SCD) resuelven un problema fundamental en data warehousing: ¿qué hacer cuando un atributo de una dimensión cambia? La respuesta depende de la necesidad de negocio de preservar el estado histórico.

Los 3 tipos principales

TIPO 1 — Sobrescribir (sin histórico):
  Antes: Cliente X — Segmento: PYME
  Después del cambio: Cliente X — Segmento: Enterprise
  → El pasado siempre parece Enterprise. Bueno para correcciones de errores.

TIPO 2 — Nuevo registro (con histórico completo):
  Registro 1: Cliente X, Segmento PYME,       valid_from: 2020-01-01, valid_to: 2023-12-31, is_current: 0
  Registro 2: Cliente X, Segmento Enterprise, valid_from: 2024-01-01, valid_to: 9999-12-31, is_current: 1
  → El análisis histórico muestra PYME en las ventas hasta 2023. El más usado.

TIPO 3 — Columna adicional (solo último + anterior):
  Cliente X — Segmento_Actual: Enterprise, Segmento_Anterior: PYME
  → Solo preserva 1 cambio. Raro pero útil para reorganizaciones.

Implementar SCD Tipo 2 con MERGE

-- Proceso ETL: aplicar los cambios del origen a la dimensión
MERGE dbo.DimCliente AS tgt
USING (SELECT nk_cliente, nombre, segmento, pais FROM stg.Clientes) AS src
    ON tgt.nk_cliente = src.nk_cliente AND tgt.is_current = 1

-- Tipo 1: actualizar atributos que no guardan histórico (nombre - corrección de error)
WHEN MATCHED AND tgt.nombre <> src.nombre
    THEN UPDATE SET tgt.nombre = src.nombre

-- Tipo 2: cerrar el registro actual e insertar uno nuevo
WHEN MATCHED AND tgt.segmento <> src.segmento
    THEN UPDATE SET tgt.valid_to = CAST(GETDATE() AS DATE), tgt.is_current = 0;

-- Insertar nuevos registros: clientes nuevos + versión nueva de los SCD2
INSERT INTO dbo.DimCliente (nk_cliente, nombre, segmento, pais, valid_from, valid_to, is_current)
SELECT src.nk_cliente, src.nombre, src.segmento, src.pais,
       CAST(GETDATE() AS DATE), '9999-12-31', 1
FROM stg.Clientes src
LEFT JOIN dbo.DimCliente tgt ON src.nk_cliente = tgt.nk_cliente AND tgt.is_current = 1
WHERE tgt.sk_cliente IS NULL
   OR (tgt.sk_cliente IS NOT NULL AND tgt.segmento <> src.segmento);

Join correcto en informes

-- Para un análisis histórico correcto, usar la surrogate key de la fecha de la transacción
SELECT
    v.ingresos,
    c.segmento,  -- el segmento del cliente EN EL MOMENTO de la venta
    d.anio
FROM dbo.FactVentas   v
JOIN dbo.DimCliente   c ON v.sk_cliente = c.sk_cliente  -- la SK preserva el contexto histórico
JOIN dbo.DimFecha     d ON v.sk_fecha   = d.sk_fecha

Conclusión

SCD Tipo 2 es la columna vertebral del análisis histórico correcto. Sin ella, los informes históricos muestran a los clientes con su segmento actual, no el que tenían cuando compraron. La surrogate key es el mecanismo que preserva el contexto — nunca haga joins por la clave natural en hechos históricos.

Compartir: