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

Cómo implementar SCD Tipo 1 en un Data Warehouse

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

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?