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、新しいレコードの がCurrentCustomerId以前のすべてのレコードの になるか、そうでない場合、レコードが挿入されてが にCustomerIdなりCurrentCustomerIdます。

4

1 に答える 1

0

ねじれたデータベース設計のようです。レコードが更新されるたびに、テーブルに挿入CustomerIdし続けることができないのはなぜですか? 挿入/更新のトリガーをテーブルに記述し、ソートされた最新の CustomerIdが Inserted/Deleted テーブルの customerId と異なる場合、テーブルにエントリを作成できます。そうすれば、現在の CustomerId から開始して時間内に戻るまでの CustomerId の履歴があります。CustomerHistoryFactCustomerFactCustomerFactCustomerHistoryFactCustomerIdEffectiveDate desc

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
于 2012-11-29T16:26:23.153 に答える