Cómo implementar SCD Tipo 1 en un Data Warehouse
En una dimensión SCD Tipo 1 de un Data Warehouse, cuando un atributo cambia el valor antiguo se sobrescribe con el nuevo y no se guarda histórico. Es la técnica ideal para corregir errores de datos o mantener atributos de referencia siempre actualizados, como la ciudad o el segmento de un cliente — casos en los que el valor anterior deja de ser relevante. A continuación implementarás SCD Tipo 1 paso a paso, con un único comando MERGE en SQL que actualiza lo que cambió e inserta lo nuevo, sin duplicar filas.
Requisitos previos
- SQL Server 2008 o superior, o una base de datos Azure SQL.
- Permisos para crear tablas e insertar o actualizar datos.
- Conocimientos básicos de SQL y del concepto de tabla de dimensión.
Paso 1: Crear la tabla de dimensión
La dimensión tiene una clave subrogada (surrogate key, una clave técnica generada automáticamente por la columna IDENTITY) y la clave de negocio (business key), que identifica a cada cliente en el origen. Los demás atributos son los campos que queremos mantener actualizados, y la columna UpdatedAt registra cuándo se modificó la fila por última vez.
CREATE TABLE dbo.DimCustomer
(
CustomerSK INT IDENTITY(1,1) PRIMARY KEY, -- surrogate key
CustomerID INT NOT NULL, -- business key
Name NVARCHAR(100) NOT NULL,
City NVARCHAR(80) NULL,
Segment NVARCHAR(40) NULL,
UpdatedAt DATETIME2 NOT NULL
);
Paso 2: Cargar el origen a staging
Coloca la foto más reciente de los clientes en una tabla de staging. Es la tabla que el MERGE comparará con la dimensión. En una carga real se llenaría desde el sistema de origen; aquí insertamos dos filas a mano para el ejemplo, donde Ana cambió de ciudad y Bruno todavía no existe en la dimensión.
CREATE TABLE dbo.StgCustomer
(
CustomerID INT NOT NULL,
Name NVARCHAR(100) NOT NULL,
City NVARCHAR(80) NULL,
Segment NVARCHAR(40) NULL
);
INSERT INTO dbo.StgCustomer (CustomerID, Name, City, Segment) VALUES
(1, N'Ana Silva', N'Porto', N'Retail'), -- City changed to Porto
(2, N'Bruno Costa', N'Braga', N'Enterprise'); -- new customer
Paso 3: Aplicar SCD Tipo 1 con MERGE
El comando MERGE lo resuelve todo en una sola instrucción. El bloque WHEN MATCHED se ocupa de los clientes que ya existen: solo sobrescribe los atributos cuando hay una diferencia real, evitando escrituras innecesarias. El bloque WHEN NOT MATCHED BY TARGET inserta los clientes nuevos.
MERGE dbo.DimCustomer AS target
USING dbo.StgCustomer AS source
ON target.CustomerID = source.CustomerID
WHEN MATCHED AND (
target.Name <> source.Name
OR target.City <> source.City
OR target.Segment <> source.Segment
) THEN
UPDATE SET
target.Name = source.Name,
target.City = source.City,
target.Segment = source.Segment,
target.UpdatedAt = SYSUTCDATETIME()
WHEN NOT MATCHED BY TARGET THEN
INSERT (CustomerID, Name, City, Segment, UpdatedAt)
VALUES (source.CustomerID, source.Name, source.City, source.Segment, SYSUTCDATETIME());
Termina siempre el comando MERGE con punto y coma: en SQL Server es obligatorio y evita un error de sintaxis difícil de localizar.
Paso 4: Comparación segura con valores NULL
El operador <> devuelve desconocido cuando uno de los lados es NULL, por lo que un cambio hacia o desde NULL puede no detectarse. Para una comparación robusta, sustituye la condición del WHEN MATCHED por un EXCEPT, que considera iguales dos valores NULL:
WHEN MATCHED AND EXISTS (
SELECT source.Name, source.City, source.Segment
EXCEPT
SELECT target.Name, target.City, target.Segment
) THEN
UPDATE SET
target.Name = source.Name,
target.City = source.City,
target.Segment = source.Segment,
target.UpdatedAt = SYSUTCDATETIME()
Verificar el resultado
Ejecuta el MERGE y luego consulta la dimensión. La ciudad de Ana debe mostrar ahora Porto (el valor antiguo desapareció) y Bruno debe aparecer como una fila nueva, sin duplicados.
SELECT CustomerSK, CustomerID, Name, City, Segment, UpdatedAt
FROM dbo.DimCustomer
ORDER BY CustomerID;
Ejecuta el mismo MERGE una segunda vez sin cambiar el origen: no se actualiza ninguna fila. Esa idempotencia confirma que el SCD Tipo 1 funciona como se espera.
Conclusión
Con un único MERGE, la dimensión refleja siempre el estado más reciente del origen, que es el objetivo del SCD Tipo 1. El siguiente paso es decidir, atributo a atributo, qué debe conservar histórico: para esos casos elegirías SCD Tipo 2, a menudo en la misma tabla. Mirando tu dimensión, ¿qué atributos tiene sentido sobrescribir y cuáles preferirías conservar a lo largo del tiempo?