1

私のデータ ウェアハウスには、親子階層を作成する次のディメンションがあります。私の問題はこれです。プライマリ キーは、親でも子でもなく、OfficePeopleID です。親は MgrPeopleID で、子は PeopleID です。
ディメンションを PeopleID に作成するときに既定のキーを変更すると、機能するように見えますが、PeopleID の複数のコピーが表示されるため、処理中にエラーが発生します。複数ある理由は、これが SCD タイプ 2 であり、主キー (OfficerPeopleID) がテーブルの代理キーであるためです。主キー以外のフィールドで親子参照を作成しようとしたのは私だけではありませんか? ありがとうございました!

寸法

4

2 に答える 2

1

私はあなたがそれをしたいとは思わない。私が正しく理解している場合、PeopleID はあなたの自然キーまたはソース システム キーであり、OfficePeopleID は DW 代理キーです。この場合、親の自然キーではなく、親の代理キーを格納する列が必要になります。つまり、テーブル自体への外部キーを作成できるはずです。現在持っているものに基づいて、マネージャーのレコードが複数ある可能性があり、どのレコードが正しいレコードであるかが曖昧になります。また、親子があなたを働かせるためには、子がテーブルのキーでなければなりません。

適切に行いたい場合は、ETL プロセスで MgrOfficerPoepleID (新しい列) を設定する必要があります。これを行う場合は、SCD2 のために新しい行があるときにマネージャー キーの値を更新してください。ただし、SSAS DSV で名前付きクエリとして実行したい場合は、次のようにすることができます。

SELECT        
    OffcerPeopleID,
    -- ... insert other columns here
    PeopleID,
    MgrPeopleID,

    (SELECT OfficerPeopleID
     FROM dbo.Employee
     WHERE(e.MgrPeopleID = PeopleID) AND (IsCurrent = 1)) AS MgrOfficerPoepleID
FROM dbo.OfficerPeopleDim AS e
WHERE IsCurrent = 1 -- this is your SCD2 flag. you could also use two date range columns
于 2012-04-25T23:57:30.157 に答える
0

PeopleID に重複したレコードが含まれている場合は、それを一意にするか、両方のフィールドを使用して関係を作成することはできません。

また、次のようなクエリを使用して、DSV に 2 つの個別のエントリを作成することをお勧めします。1 つはマネージャー用、もう 1 つは従業員用です。

マネジャー:

select PeopleID as ManagerID, name as Name from OfficerPeopleDim

従業員:

select PeopleID as EmployeeID, name, MgrPeopleId as Manager
from OfficerPeopleDim
where MgrPeopleId is not null

したがって、次のようになり (左)、右側に結果が生成されます。 ここに画像の説明を入力

于 2012-04-27T08:37:15.073 に答える