跳到主要内容
处理层次结构数据

在该页面上

处理层次结构数据

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

从层次结构的顶层到底层,会员的信息越来越详细。例如,在拥有 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 前缀加载的数据的示例
    Table showing sample of data loaded using Hierarchy prefix.

信息注释要了解关于层级的更多信息,请参阅Qlik Community中该文章:层级

HierarchyBelongsTo 前缀

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

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

执行以下操作:

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

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

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

    表格示出了使用 HierarchyBelongsTo 前缀加载的数据
    Table showing data loaded using HierarchyBelongsTo prefix.

授权

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

组织层次结构示例

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

授权表格
ACCESS NTNAME PERSON POSITION PERMISSIONS
USER ACME\JRL “John” CPO HR
USER ACME\CAH Carol CEO CEO
USER ACME\JER James Director Engineering Engineering
USER ACME\DBK Diana CFO Finance
USER ACME\RNL Bob COO Sales
USER ACME\LFD Larry CTO Product

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

Example:  

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

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

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

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

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

数据模型:AuthorizationTreesFactNodes 表格
Data model: Authorization, Trees, Fact, and Nodes tables.