SCD mesa de cremallera dimensional que cambia lentamente

                           SCD que cambia lentamente la implementación de SQL de la tabla de cremallera dimensional

1 Descripción general de las dimensiones que cambian lentamente

Dimensiones de cambio lento en inglés de SCD (Dimensiones de cambio lento de SCD), es un concepto muy importante en el proceso de modelado del almacén de datos. Como todos sabemos, el almacén de datos se basa en datos históricos, y el cambio de datos históricos depende de la definición de dimensión. La dimensión de cambio lento es un método utilizado para rastrear y expresar el cambio de tabla de dimensión.

Nota: 1 El entorno de demostración de código actual es SQL Server, basado en la sintaxis Merge, similar a otras bases de datos.

      2 SCD transforma lentamente la realización de la caldera de dimensión

 

Por lo general, hay 3 que se indican respectivamente como Tipo1, Tipo2 y Tipo3. Aquí, si tenemos una tabla de dimensiones de usuario cliente cliente (cust_id número de usuario, nombre nombre, edad edad), si la edad de un usuario se actualiza a 40 en un momento determinado, veamos la situación de los métodos de procesamiento de tres dimensiones.

  • Type1 (no registrará los cambios históricos de los valores del campo clave en la dimensión):

cust_id nombre edad

1 hoja de tres 30

La nueva tabla de clientes es:

cust_id nombre edad

1 hoja de tres 40

  • Tipo 2:

Para el caso de 1, se asume que el tiempo de actualización es 2020-10-21

cust_id nombre edad start_date end_date is_current

1 tres 30 2020-10-10 2020-10-21 0

1 Zhang San 40 2020-10-21 9999-10-21 1

  • Tipo3

Registre directamente el último valor actual y el valor antes del último cambio

cust_id nombre edad pre_edad

1 hoja tres 30 40

En resumen, no es difícil encontrar que type1 y type2 no pueden registrar bien el cambio de dimensión, type1 no lo hace y type3 solo puede registrar el último cambio.

 

2 Código y comentarios

2.1 Estructura y datos de la tabla

-- step1 准备表和数据,当前运行在SQL Server里。

-- 业务系统(OLTP)的客户表
CREATE TABLE Customer(
       ID int IDENTITY(1,1) NOT NULL,
       FullName nvarchar(50) NULL,
       City nvarchar(50) NULL,
       Occupation nvarchar(50) NULL)

      
-- 数据仓库的(OLAP)的客户维度表
CREATE TABLE DimCustomer(
              CustomerID int IDENTITY(1,1) NOT NULL,
              CustomerAlternateKey int NULL,
              FullName nvarchar(50) NULL,
              City nvarchar(50) NULL,
              Occupation nvarchar(50) NULL,
              StartDate datetime NULL,
              EndDate datetime NULL,
              IsCurrent bit NULL,
       PRIMARY KEY CLUSTERED
       (
              CustomerID ASC
       )
)

GO

ALTER TABLE DimCustomer ADD  DEFAULT ((1)) FOR IsCurrent
INSERT INTO Customer(FullName,City,Occupation)
SELECT 'BIWORK','Beijing','CEO' UNION ALL
SELECT 'ZhangSan','Shanghai','Education' UNION ALL
SELECT 'Lisi','Guangzhou','IT' UNION ALL
SELECT 'Wangwu','Beijing','Finance'

2.2 Transforme lentamente el código dimensional

-- step2 SCD 模块
-- 1 修改状态
MERGE INTO dbo.DimCustomer AS Dim
USING dbo.Customer AS Src
    ON Dim.CustomerAlternateKey = Src.ID
WHEN NOT MATCHED BY TARGET
    THEN INSERT VALUES(Src.ID,Src.FullName,Src.City,Src.Occupation,GETDATE(),NULL,1)
WHEN MATCHED AND (Dim.City <> Src.City OR Dim.Occupation <>  Src.Occupation) AND Dim.IsCurrent=1

    THEN UPDATE SET Dim.EndDate =CASE WHEN Dim.EndDate IS NULL THEN GETDATE() ELSE Dim.EndDate END,Dim.IsCurrent = 0;

-- 2 修改数据
MERGE INTO dbo.DimCustomer AS Dim
USING dbo.Customer AS Src
    ON Dim.CustomerAlternateKey = Src.ID
       AND Dim.City = Src.City AND Dim.Occupation = Src.Occupation
       WHEN NOT MATCHED BY TARGET
       THEN INSERT VALUES(Src.ID,Src.FullName,Src.City,Src.Occupation,getDATE(),NULL,1);

 

2.3  Modificar la verificación de datos

-- Step3 验证
-- 新插入一条
INSERT INTO Customer(FullName,City,Occupation) VALUES
('qinliu','Beijing','Finance')


-- Case1: 执行如下更新后执行SCD模块,这里的ID依赖于自增序列生成的序号

UPDATE Customer
SET Occupation = 'IT'
WHERE ID = 6


-- Case2: 执行如下更新后执行SCD模块,这里的ID依赖于自增序列生成的序号
UPDATE Customer
SET Occupation = 'Publisher',
    City = 'Hangzhou'
WHERE ID = 6

-- 每次修改后对照查看DimCustomer表的变化,查看是否追踪到数据的历史变更信息。

 

Supongo que te gusta

Origin blog.csdn.net/shenliang1985/article/details/114079616
Recomendado
Clasificación