处理层次结构数据
层次结构是所有商业智能解决方案的重要组成部分,用于介绍合理包含不同级别粒度的维度。有些层次结构非常简单和直观,而其他层次结构非常复杂,需要经过深思熟虑后才能进行正确建模。
从层次结构的顶层到底层,会员的信息越来越详细。例如,在拥有 Market、Country、State 和 City 级别的维度中,会员美洲出现在层次结构的顶层,会员美国出现在第二层,会员加州出现在第三层且旧金山出现在底层。加州比美国更加具体,而旧金山比加州更加具体。
在关系模型中存储层次结构是多种解决方案的共同挑战。可以通过以下多种方法来解决该挑战:
- 水平层次结构
- 邻接表模型
- 路径枚举法
- 嵌套集合模型
- 祖先列表
对于本教程,我们将创建一个祖先列表,因为它能够以可直接在查询中使用的形式显示层次结构。有关其他方法的更多信息,请参阅Qlik Community。
Hierarchy 前缀
Hierarchy 前缀是放置在 LOAD 或 SELECT 语句前面的脚本命令,用于加载相邻节点表。LOAD 语句需要具有至少三个字段:ID 是节点的唯一密钥,涉及父级和名称。
前缀将加载的表格转换成扩展的节点表格;表格含有许多其他列;层次结构的每一层都拥有一个表格。
执行以下操作:
- 创建一个新应用程序并为其指定一个名称。
- 在数据加载编辑器中新增脚本段。
- 调用部分 Wine。
-
在右菜单的 DataFiles 下,单击选择数据。
- 上传然后选择 Winedistricts.txt。
- 在选择数据自窗口中,取消选中 Lbound 和 RBound 字段,从而不加载它们。
- 单击插入脚本。
- 在 LOAD 语句上方输入以下内容:
- 单击加载数据。
- 使用数据模型查看器的预览部分查看生成的表格。
- 所有节点名称都存在于一个表格中的同一列中,因此可用于搜索。
- 此外,已将不同的节点级别扩展到每个表格中的一个字段;可用于向下钻取组或透视表中的维度的字段。
- 此外,已将不同的节点级别扩展到每个表格中的一个字段;字段可用于向下钻取组。
- 可使它包含节点的唯一路径,从而按正确的顺序列出所有祖先节点。
- 可使它包含节点的深度,即到根节点的距离。
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);
生成的扩展节点表拥有与其源表数量相同的记录:每个节点一条记录。扩展节点表非常实用,因为它满足在关系模型中分析层次结构的许多要求:
最终生成的表格如下所示:
HierarchyBelongsTo 前缀
和 Hierarchy 前缀相似,HierarchyBelongsTo 前缀是放置在 LOAD 或 SELECT 语句前面的脚本命令,用于加载相邻节点表。
另外,LOAD 语句需要具有至少三个字段:ID 是节点的唯一密钥,涉及父级和名称。前缀将加载的表格转换成祖先节点表格,该表格拥有列出作为单独记录的祖先和后代的每个组合。因此,可以很轻松地找到特定节点的所有祖先或所有后代。
执行以下操作:
- 修改数据加载编辑器中的 Hierarchy 语句,使其为如下所示:
HierarchyBelongsTo (NodeID, ParentID, NodeName, BelongsToID, BelongsTo)
- 单击加载数据。
- 使用数据模型查看器的预览部分查看生成的表格。
- 如果节点 ID 表示单个节点,则上级 ID 表示层次结构的整个树和子树。
- 存在的所有节点名称均可在角色中作为节点和树,且可用于搜索。
- 可以使它包含节点深度与祖先节点深度之间的深度差,即到子树根节点的距离。
祖先节点表可满足在关系模型中分析层次结构的许多要求:
最终生成的表格如下所示:
授权
通常在很少情况下,使用层次结构进行授权。其中一个示例是组织层次结构。每位经理都应有权查看与其自己的部门有关的所有信息,包括其所有子部门。但是,他们不得有权查看其他部门。
这意味着将会允许不同的人查看组织的不同子树。授权表可能如下所示:
ACCESS | NTNAME | PERSON | POSITION | PERMISSIONS |
---|---|---|---|---|
USER | ACME\JRL | John | CPO | HR |
USER | ACME\CAH | Carol | CEO | CEO |
USER | ACME\JER | James | 工程总监 | 工程 |
USER | ACME\DBK | Diana | CFO | 财务 |
USER | ACME\RNL | Bob | COO | 销售额值 |
USER | ACME\LFD | Larry | CTO | 产品 |
在此例中,允许 Carol 查看 CEO 及以下职位的任何相关信息;允许 Larry 查看 Product 组织;只允许 James 查看 Engineering 组织。
示例:
层次结构通常存储在相邻的节点表中。在本例中,要解决此问题,可以使用 HierarchyBelongsTo 加载相邻节点表格并命名上级字段 Tree。
如果您希望使用 Section Access,则需要加载 Tree 的大写副本并将此称为新字段 PERMISSIONS。最后,您需要加载授权表。这两个最后步骤可使用以下脚本行完成。注意 TempTrees 表是通过 HierarchyBelongsTo 语句创建的表。
注意这仅为示例。在 Qlik Sense 中没有附带的练习。
此示例将生成以下数据模型: