跳到主要内容 跳到补充内容

处理层次结构数据

层次结构是所有商业智能解决方案的重要组成部分,用于介绍合理包含不同级别粒度的维度。有些层次结构非常简单和直观,而其他层次结构非常复杂,需要经过深思熟虑后才能进行正确建模。

从层次结构的顶层到底层,会员的信息越来越详细。例如,在拥有 Market、Country、State 和 City 级别的维度中,会员美洲出现在层次结构的顶层,会员美国出现在第二层,会员加州出现在第三层且旧金山出现在底层。加州比美国更加具体,而旧金山比加州更加具体。

在关系模型中存储层次结构是多种解决方案的共同挑战。可以通过以下多种方法来解决该挑战:

  • 水平层次结构
  • 邻接表模型
  • 路径枚举法
  • 嵌套集合模型
  • 祖先列表

对于本教程,我们将创建一个祖先列表,因为它能够以可直接在查询中使用的形式显示层次结构。有关其他方法的更多信息,请参阅Qlik Community

Hierarchy 前缀

Hierarchy 前缀是放置在 LOADSELECT 语句前面的脚本命令,用于加载相邻节点表。LOAD 语句需要具有至少三个字段:ID 是节点的唯一密钥,涉及父级和名称。

前缀将加载的表格转换成扩展的节点表格;表格含有许多其他列;层次结构的每一层都拥有一个表格。

  1. 创建一个新应用程序并为其指定一个名称。
  2. 数据加载编辑器中新增脚本段。
  3. 调用部分 Wine
  4. 在右菜单的 DataFiles 下,单击选择数据

  5. 上传然后选择 Winedistricts.txt
  6. 选择数据自窗口中,取消选中 LboundRBound 字段,从而不加载它们。
  7. 单击插入脚本
  8. LOAD 语句上方输入以下内容:
  9. Hierarchy (NodeID, ParentID, NodeName)

    您的脚本应如下所示:

    Hierarchy (NodeID, ParentID, NodeName)
    LOAD
        NodeID,
        ParentID,
        NodeName
    FROM [lib://DataFiles/Winedistricts.txt] 
    (txt, utf8, embedded labels, delimiter is '\t', msq);			

  10. 单击加载数据
  11. 使用数据模型查看器预览部分查看生成的表格。
  12. 生成的扩展节点表拥有与其源表数量相同的记录:每个节点一条记录。扩展节点表非常实用,因为它满足在关系模型中分析层次结构的许多要求:

    • 所有节点名称都存在于一个表格中的同一列中,因此可用于搜索。
    • 此外,已将不同的节点级别扩展到每个表格中的一个字段;可用于向下钻取组或透视表中的维度的字段。
    • 此外,已将不同的节点级别扩展到每个表格中的一个字段;字段可用于向下钻取组。
    • 可使它包含节点的唯一路径,从而按正确的顺序列出所有祖先节点。
    • 可使它包含节点的深度,即到根节点的距离。

    最终生成的表格如下所示:

    表格示出了使用 Hierarchy 前缀加载的数据的示例

    表格示出了使用 Hierarchy 前缀加载的数据的示例。

HierarchyBelongsTo 前缀

Hierarchy 前缀相似,HierarchyBelongsTo 前缀是放置在 LOADSELECT 语句前面的脚本命令,用于加载相邻节点表。

另外,LOAD 语句需要具有至少三个字段:ID 是节点的唯一密钥,涉及父级和名称。前缀将加载的表格转换成祖先节点表格,该表格拥有列出作为单独记录的祖先和后代的每个组合。因此,可以很轻松地找到特定节点的所有祖先或所有后代。

  1. 修改数据加载编辑器中的 Hierarchy 语句,使其为如下所示:
  2. HierarchyBelongsTo (NodeID, ParentID, NodeName, BelongsToID, BelongsTo)
  1. 单击加载数据
  2. 使用数据模型查看器预览部分查看生成的表格。
  3. 祖先节点表可满足在关系模型中分析层次结构的许多要求:

    • 如果节点 ID 表示单个节点,则上级 ID 表示层次结构的整个树和子树。
    • 存在的所有节点名称均可在角色中作为节点和树,且可用于搜索。
    • 可以使它包含节点深度与祖先节点深度之间的深度差,即到子树根节点的距离。

    最终生成的表格如下所示:

    表格示出了使用 HierarchyBelongsTo 前缀加载的数据

    显示使用 HierarchyBelongsTo 前缀加载的数据的表。

授权

通常在很少情况下,使用层次结构进行授权。其中一个示例是组织层次结构。每位经理都应有权查看与其自己的部门有关的所有信息,包括其所有子部门。但是,他们不得有权查看其他部门。

组织层次结构示例

这意味着将会允许不同的人查看组织的不同子树。授权表可能如下所示:

授权表格
ACCESSNTNAMEPERSONPOSITIONPERMISSIONS
USERACME\JRLJohnCPOHR
USERACME\CAHCarolCEOCEO
USERACME\JERJames工程总监工程
USERACME\DBKDianaCFO财务
USERACME\RNLBobCOO销售额值
USERACME\LFDLarryCTO产品

在此例中,允许 Carol 查看 CEO 及以下职位的任何相关信息;允许 Larry 查看 Product 组织;只允许 James 查看 Engineering 组织。

示例:  

层次结构通常存储在相邻的节点表中。在本例中,要解决此问题,可以使用 HierarchyBelongsTo 加载相邻节点表格并命名上级字段 Tree

如果您希望使用 Section Access,则需要加载 Tree 的大写副本并将此称为新字段 PERMISSIONS。最后,您需要加载授权表。这两个最后步骤可使用以下脚本行完成。注意 TempTrees 表是通过 HierarchyBelongsTo 语句创建的表。

注意这仅为示例。在 Qlik Sense 中没有附带的练习。

Trees: LOAD *, Upper(Tree) as PERMISSIONS Resident TempTrees; Drop Table TempTrees;   Section Access; Authorization: LOAD ACCESS, NTNAME, UPPER(Permissions) as PERMISSIONS From Organization; Section Application;

此示例将生成以下数据模型:

数据模型:AuthorizationTreesFactNodes 表格

数据模型:

本页面有帮助吗?

如果您发现此页面或其内容有任何问题 – 打字错误、遗漏步骤或技术错误 – 请告诉我们如何改进!