2012-11-29 23 views
1

您好想要将数据导入到我的数据仓库并简化导入一些数据我想在表中创建一个新的列,将跟踪最新的值,因为我得到新的数据。定义具有变量根的记录的递归查询

我的表如下所示:

CREATE TABLE CustomerFact(
Id INT IDENTITY PRIMARY KEY 
,CustomerId NVARCHAR(20) NOT NULL --Current Id of a Customer 
); 

--Track changes to CustomerId 
CREATE TABLE CustomerHistoryFact(
Id INT IDENTITY PRIMARY KEY 
,CurrentCustomerId NVARCHAR(20) --Most recent Customer Id 
,CustomerId NVARCHAR(20) NOT NULL --Customer Id at time of record insert 
,PrvsCustomerId NVARCHAR(20) NOT NULL --Customer Id at time of transaction 
,PrvsCustomerIdEffectiveDate DATE NOT NULL --Date when PrvsCustomerId was effective 
,PrvsCustomerIdObsoleteDate DATE NOT NULL --When the PrvsCustomerId was expired and replaced with a new Customer Id 
); 

CustomerIdPrvsCustomerIdPrvsCustomerIdEffectiveDate,并PrvsCustomerIdObsoleteDate都是外在的。无论何时插入新记录,我都要分配一个CurrentCustomerId

这取决于插入新的CustomerHistoryFact的时间,请检查PrvsCustomerId以及所有其他记录的CurrentCustomerId。如果有一个匹配,那么新记录的CustomerId变的记录插入所有以前的记录,否则CurrentCustomerIdCustomerId成为CurrentCustomerId

回答

0

似乎是一个扭曲的数据库设计。为什么你就不能继续在CustomerHistoryFact表中插入CustomerId,每次的CustomerFact记录被更新?如果按CustomerIdEffectiveDate desc排序的最新CustomerId与Inserted/Deleted表中的customerId不同,则可以在CustomerFact表上写入用于插入/更新的触发器,并输入CustomerHistoryFact表。这样,您就有了CustomerId的历史记录,可以从当前CustomerId开始回溯到时间。

CREATE TABLE CustomerFact(
Id INT IDENTITY PRIMARY KEY 
,CustomerId NVARCHAR(20) NOT NULL --Current Id of a Customer 
); 

--Track changes to CustomerId 
CREATE TABLE CustomerHistoryFact(
Id INT IDENTITY PRIMARY KEY 
,CustomerId NVARCHAR(20) --Most recent Customer Id 
,PrevCustomerId NVARCHAR(20) NOT NULL --Customer Id at time of record insert 
,UpdatedDate DATETIME NOT NULL --Date when PrvsCustomerId was effective 
); 

CREATE TRIGGER dbo.CustomerFact_IU 
ON dbo.CustomerFact 
AFTER INSERT, UPDATE 
AS 
BEGIN 
    SET NOCOUNT ON; 

    -- 
    -- Check if this is an INSERT, UPDATE. 
    -- 
    DECLARE @action as char(1); 
    DECLARE @oldCustomerId NVARCHAR(20); 

    SET @action = 'I'; -- Set Action to Insert by default. 
    IF EXISTS(SELECT * FROM DELETED) 
    SELECT @oldCustomerId = customerId from DELETED 
    BEGIN 
     SET @action = 
      CASE 
       WHEN EXISTS(SELECT * FROM INSERTED) THEN 'U' -- Set Action to Updated. 
       ELSE 'D' -- Set Action to Deleted.  
      END 
    END 
    ELSE 
     IF NOT EXISTS(SELECT * FROM INSERTED) RETURN; -- Nothing updated or inserted. 

    IF @action = 'I' OR @action = 'U' 
    BEGIN 
     INSERT INTO dbo.CustomerHistoryFact 
     SELECT CustomerId, @oldCustomerId, GETUTCDATE() FROM INSERTED 
    END 

    END 
+0

要考虑的事情是我从现有的数据源导入'CustomerFact'和'CustomerHistoryFact'。他们将随着时间的推移提供其数据的增量更新,因此我需要将他们的更改导入到现有的数据集中。你的策略可能会起作用,我会研究它。 – Romoku

+0

看看更新后的答案 – tranceporter

+0

事情是,PrvsCustomerIdEffectiveDate和PrvsCustomerIdObsoleteDate可以合并到一列UpdatedDate中。这是因为一个CustomerHistoryFact记录的updatedDate成为过去记录的过时日期。 – tranceporter