您正在尝试将数据导入我的数据仓库并简化导入某些数据,我希望在表中创建一个新列,以便在获取新数据时跟踪最新值。
我的表格如下:
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
);
CustomerId
,PrvsCustomerId
,PrvsCustomerIdEffectiveDate
和PrvsCustomerIdObsoleteDate
都是外部的。我想在插入新记录时分配CurrentCustomerId
。
这取决于插入新CustomerHistoryFact
的时间,检查PrvsCustomerId
所有其他记录的CurrentCustomerId
。如果匹配,则新记录的CustomerId
将成为所有先前记录的CurrentCustomerId
,否则将插入记录,CustomerId
将成为CurrentCustomerId
。
答案 0 :(得分:0)
似乎是一个扭曲的数据库设计。每当CustomerId
记录更新时,为什么不能继续在CustomerHistoryFact
表中插入CustomerFact
?如果按CustomerFact
排序的最新CustomerId与Inserted / Deleted表中的customerId不同,您可以在CustomerHistoryFact
表上编写用于插入/更新的触发器,并进入CustomerIdEffectiveDate desc
表。 。这样,您就可以获得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