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.