【问题标题】:Loading Dimension Tables - Methodologies加载维度表 - 方法
【发布时间】:2010-06-10 12:29:57
【问题描述】:

最近我一直在做一个项目,需要从 EDW 表填充 Dim 表。

EDW 表属于 II 类,可维护历史数据。加载 Dim Table 时,其来源可能是多个 EDW 表,也可能是具有多级透视(在属性上)的单个表。

平均值:将有 10 条记录 - 每个属性一个,需要在 domain_code 上进行旋转以在 Dim 中形成单行。在这 10 条记录中,会有一些属性具有相同的 domain_code 但具有不同的 sub_domain_code,这需要进一步针对子域代码进行透视。

例如:

如果我得到域代码:01,02, 03 => 它们是域代码的直接支点 我还会有域代码:10,子域代码/版本为 2006,2007,2008,2009

这意味着我需要将具有上述属性的源表拆分为两个 => 一个用于域代码,另一个用于域代码 + 版本。

到目前为止一切顺利。

在加载 Dim Table 时:

根据Dimensions的设计规范(最初由第三方编写),他们想要的是:

对于 EDW(属性)中的每一次更改,它应该组合所有相关记录(对于该 NK)意味着新记录与其他当前属性值 => 处理它们以创建新的暗记录并插入它。

这意味着如果单个数据提取包含更新的 100 条记录(每个 NK 一条),它应该组合 100 + (100*9) 条记录来插入/更新暗表。这种方法有多好。

我尝试做的其他方法是查找该 NK 的暗表,获取最近记录的值(未更改的属性)并将其插入并更新当前记录。

在源端为一个属性更改组装记录或查看暗表的最近记录并处理它的更好方法是什么。

如果这没有意义,想进一步阐述。

谢谢

这是表格的模型

alt text http://img96.imageshack.us/img96/1203/modelzp.jpg

【问题讨论】:

  • 抱歉,我很难理解这里发生了什么。也许你可以详细说明一些。在我的书中,dimTable 是一个维度表,它是 EDW(企业数据仓库)的一部分。也许您可以发布某种模型并使用示例来解释问题。
  • 我同意,如果您可以发布带有示例数据和输出的源和目标表模式的相对简单版本(实际上可能是维度人们所期望的中间模式),我认为我们可以提供帮助更容易。
  • 对不起,当我说 edw table 时,它​​意味着我暂存了构建数据集市的表。是的,我会尽快发布模型。谢谢

标签: sql-server data-warehouse dimensions datamart


【解决方案1】:

看看this example

应该比较简单。

它会根据您的规则旋转基础数据。

它决定了非规范化“行”的变化时间

它创建一个三角连接来确定每个时期的开始和结束(我称之为快照)

然后它将这些窗口连接到基础数据以确定当时数据的状态(此时枢轴实际上已完成)

我认为您可能需要查看窗口机制 - 它正在返回正确的数据,但我不喜欢窗口重叠逻辑在我看来的方式 - 它并不小 - 我很担心边界条件。

-- SO3014289

CREATE TABLE #src (
    key1 varchar(4) NOT NULL
    ,key2 varchar(3) NOT NULL
    ,key3 varchar(3) NOT NULL
    ,AttribCode int NOT NULL
    ,AttribSubCode varchar(2)
    ,Value varchar(10) NOT NULL
    ,[Start] date NOT NULL
    ,[End] date NOT NULL
)

INSERT INTO #src VALUES
('9750', 'C04', '789', 1, NULL, 'AAA', '1/1/2000', '12/31/9999')
,('9750', 'C04', '789', 2, NULL, 'BBB', '1/1/2000', '12/31/9999')
,('9750', 'C04', '789', 3, 'V1', 'XXXX', '1/1/2000', '12/31/9999')
,('9750', 'C04', '789', 3, 'V2', 'YYYY', '1/1/2000', '1/2/2000')
,('9750', 'C04', '789', 3, 'V2', 'YYYYY', '1/2/2000', '12/31/9999')

;WITH basedata AS (
    SELECT key1 + '-' + key2 + '-' + key3 AS NK
    ,CASE WHEN AttribCode = 1 THEN Value ELSE NULL END AS COL1
    ,CASE WHEN AttribCode = 2 THEN Value ELSE NULL END AS COL2
    ,CASE WHEN AttribCode = 3 AND AttribSubCode = 'V1' THEN Value ELSE NULL END AS COL3
    ,CASE WHEN AttribCode = 3 AND AttribSubCode = 'V2' THEN Value ELSE NULL END AS COL4
    ,[Start]
    ,[End]
    FROM #src
)
,ChangeTimes AS (
    SELECT NK, [Start] AS Dt
    FROM basedata
    UNION 
    SELECT NK, [End] AS Dt
    FROM basedata
)
,Snapshots as (
    SELECT s.NK, s.Dt AS [Start], MIN(e.Dt) AS [End]
    FROM ChangeTimes AS s
    INNER JOIN ChangeTimes AS e
        ON e.NK = s.NK
        AND e.Dt > s.Dt
    GROUP BY s.NK, s.Dt
)
SELECT Snapshots.NK
    ,MAX(COL1) AS COL1
    ,MAX(COL2) AS COL2
    ,MAX(COL3) AS COL3
    ,MAX(COL4) AS COL4
    ,Snapshots.[Start]
    ,Snapshots.[End]
FROM Snapshots
INNER JOIN basedata
    ON basedata.NK = Snapshots.NK
    AND NOT (basedata.[End] <= Snapshots.[Start] OR basedata.[Start] >= Snapshots.[End])
GROUP BY Snapshots.NK
    ,Snapshots.[Start]
    ,Snapshots.[End]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多