【问题标题】:Flattening a Recursive Hierarchy Into a Dimension with SSIS使用 SSIS 将递归层次结构扁平化为维度
【发布时间】:2010-11-03 16:54:49
【问题描述】:

我在关系数据库中有一个递归层次结构,这反映了团队及其在层次结构中的位置。

我希望将此层次结构扁平化为数据仓库的维度,它是一个 SQL Server 数据库,使用 SSIS 到 SSAS。

我有一张桌子,团队:

teamid Teamname
1      Team 1
2      Team 2

还有一个table teamhierarchymapping:

Teamid  heirarchyid
1       4
2       2

还有一个表层次结构:

sequenceid  parentsequenceid  Name
1           null              root
2           1                 Level 1.1
3           1                 Level 1.2
4           3                 Level 1.2 1

给予

      Level 1.1 (Contains Team 2)
root <
      Level 1.2 <
                 Level 1.2 1 (Contains Team 1)

我想将其展平为如下尺寸:

Team Name   Level 1    Level 2    Level 3
Team 1      Root       Level 1.1  [None]
Team 2      Root       Level 1.2  Level 1.2 1

我尝试了各种令人讨厌的 SQL 集来尝试将它们组合在一起,并在 SSIS 中使用各种管道(我刚刚开始学习),但我没有找到将它们组合在一起的解决方案。

谁能帮忙?

(我认为用示例数据编辑更正的问题)

【问题讨论】:

    标签: sql sql-server ssis etl


    【解决方案1】:

    您的示例数据有错误吗?我看不到层次结构映射如何连接到层次结构表以获得您想要的结果,除非层次结构映射是 teamid 1 => hierid 2 和 teamid 2 => hierid 4。

    SSIS 可能无法(轻松地)做到这一点,因此最好创建一个执行以下格式的 SQL 的 OLEDB 源。请注意,这确实假设您使用的是 SQL Server 2008,因为那里引入了“PIVOT”功能......

    WITH hier AS (
        SELECT parentseqid, sequenceid, hiername as parentname, hiername FROM TeamHierarchy
        UNION ALL
        SELECT hier.parentseqid, TH.sequenceid, hier.parentname, TH.hiername FROM hier
            INNER JOIN TeamHierarchy TH ON TH.parentseqid = hier.sequenceid
        ),
        teamhier AS (
            SELECT T.*, THM.hierarchyid FROM Teams T
                INNER JOIN TeamHierarchyMapping THM ON T.teamid = THM.teamid
        )
        SELECT *
            FROM (
                SELECT ROW_NUMBER() OVER (PARTITION BY teamname ORDER BY teamname, sequenceid, parentseqid) AS 'Depth', hier.parentname, teamhier.teamname
                    FROM hier
                        INNER JOIN teamhier ON hier.sequenceid = teamhier.hierarchyid
            ) as t1
            PIVOT (MAX(parentname) FOR Depth IN ([1],[2],[3],[4],[5],[6],[7],[8],[9])) AS pvtTable
            ORDER BY teamname;
    

    这有几个不同的元素,可能有更好的方法来做到这一点,但对于扁平化层次结构,CTE 是理想的。

    创建了两个 CTE:'hier' 负责扁平化层次结构,'teamhier' 只是一个帮助“视图”,以使以后的连接更简单。如果您只使用更高层次的 CTE 并运行它,您将获得扁平视图:

    WITH hier AS (
        SELECT parentseqid, sequenceid, hiername as parentname, hiername FROM TeamHierarchy
        UNION ALL
        SELECT hier.parentseqid, TH.sequenceid, hier.parentname, TH.hiername FROM hier
            INNER JOIN TeamHierarchy TH ON TH.parentseqid = hier.sequenceid
        )
        SELECT * FROM hier ORDER BY parentseqid, sequenceid
    

    它的下一部分基本上采用这个扁平化视图,将其连接到您的团队表(以获取团队名称)并使用 SQL Server 的 PIVOT 将其旋转并按照您的需要对齐所有内容。更多关于 PIVOT 的信息is available on the MSDN

    如果您使用的是 SQL Server 2005,那么您可以只使用层次结构扁平化位,并且应该能够使用 SSIS 的本机“PIVOT”转换块来完成脏数据透视工作。

    【讨论】:

      【解决方案2】:

      您是否需要扁平化层次结构?考虑 SSAS 中的父子层次维度类型,它处理可变深度层次结构,并允许平面层次结构不允许的额外功能/特性:

      http://msdn.microsoft.com/en-us/library/ms174846.aspx

      http://msdn.microsoft.com/en-us/library/ms174935.aspx

      【讨论】:

      • 有趣的是,必须研究 SSAS 对此的支持。 Kimble 的建议是将它们压平以提高性能。
      • @THEMike,有趣,我没听说过 - 我有 Kimball 的书“Microsoft 数据仓库工具包”,它提到了父/子维度 - 它说它们是 SSAS 的一个有价值的部分,但是如果您的系统非常大,或者您不具备启动时的专业知识,您可能希望以扁平维度启动。顺便说一句,很棒的书,我会推荐它(我希望 2008 版很快就会出现)amazon.com/…
      • 一点阅读,似乎父子在 SCD2 中并不那么简单,因为顶部条目发生变化时会发生级联变化。 SCD1 看起来更简单,但在员工昏暗的情况下这是一个不太可能的选择。 Joy(来自 Kimball 大学)有一篇关于该主题的好文章 intelligent-enterprise.informationweek.com/…
      猜你喜欢
      • 1970-01-01
      • 2022-01-23
      • 1970-01-01
      • 2020-03-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-01
      • 2016-06-03
      相关资源
      最近更新 更多