层次结构
层次结构 (Hierarchy) 是维度中用于组织数据层次结构的概念。通过层次结构,用户可以定义维度成员的层次关系,从而在数据分析中提供更灵活的查询和展示方式。
名词解释:
- 层次结构(Hierarchy)
- 层级(Level)
层次结构 显示维度表中的列组之间的关系。例如,季度包含月份,月份包含天。使用层次结构可以在报表中钻探。
维度可以具有一个或多个层次结构。层次结构通常从合计层级开始,然后是子层级,最后细分到最低详细层级。
维度的所有层次结构必须具有一个共同的最低层级。例如,时间维度可以包含一个财政层次结构和一个日历层次结构,并将天
作为共同的最低层级。天具有两个命名的父级(名为财政年度和日历年度),二者均是全部
根层级的子级。
除合计层级以外的所有层级必须至少具有一个指定为键或显示列的列。但是,不必将表中的所有列与级别显式关联。未与层级关联的任何列都将与层次(与该维度表对应)中的最低层级关联。
层次结构中可包含的层级数没有限制。层级总数自身不是查询性能的确定因素。但是,请注意对于极其复杂的查询,即使是几个层级也会影响性能。
创建层次结构
点击维度的层次结构导航栏中 新建按钮 创建层次结构.
- 打开属性界面, 编辑层次结构属性: 见下方
- 将数据表中的物理表名拖至维度表区域, 添加为维度层次结构的维度表.
- 维度表可以添加一个或多个.
- 当维度表添加了多个时, 右侧维度表关系设计界面会自动打开, 也可以手动打开, 选择表之间的关系和新增关联的左键和右键, 对维度表进行关联.
层次结构属性
层次结构所有的属性列表
属性 | 英文名称 | 描述 | 可选值 |
---|---|---|---|
名称 | Name | 唯一名称标识 | 一般使用英文字符 |
标签 | Caption | 语言描述 | 用户语言 |
描述 | Description | 长文本描述 | 用户语言 |
是否显示 | Visible | 是否对用户可见 | |
有 All 成员 | Has All Member | 是否存在 All 成员, 如果是层次结构将包含默认的所有成员这一层级, 这个层级将作为首个层级 | |
All 成员名称 | All Member Name | 取代默认生成的 All 成员名称 | |
All 成员标签 | All Member Caption | All 成员的标签 | |
All 层级名称 | All Level Name | All 层级的名称 | |
维度表 | Dimension Tables | 维度表 | 物理表数组 |
主键 | Primary Key | 选择一个维度表字段作为层次结构的主键 | |
主键表 | Primary Key Table | 当维度表个数超过一个时需要指定一个表作为维度的主表 | |
默认成员 | Default Member | 在查询时当没有指定维度成员时, 将使用默认成员对维度进行限定 |
创建层级
- 依次将维度表中的字段拖至层级区域, 顺序为由粗粒度字段到细粒度字段, 也可以在层级区域对字段调整顺序.
- 拖动层级字段:
- 可以调整层级之间的顺序.
- 可以拖回维度表区域将层级移除.
- 可以拖至删除图标处将其移除.
- 选中层级, 打开属性界面, 可以对此层级的属性进行设置: 见下面属性列表;
层级属性
层级所有的属性列表
属性 | 英文名称 | 描述 | 可选值 |
---|---|---|---|
名称 | Name | 唯一名称标识 | 一般使用英文字符 |
标签 | Caption | 语言描述 | 用户语言 |
描述 | Description | 长文本描述 | 用户语言 |
是否显示 | Visible | 是否对用户可见 | |
成员唯一 | Unique Members | 此属性用于优化 SQL 生成. 如果您知道维度表中给定层级列的值在父层级中该列的所有其他值中是唯一的, 那么设置为"true", 否则设置为 "false". | |
字段 | Column | 层级对应的数据表字段, 作为层级的主键 | |
值类型 | Type | 层级字段对应的数据库类型, 有利于引擎生成正确的执行语句 | |
名称字段 | Name Column | 组成层级成员的输出 ID, 如果为设置名称字段则成员 ID 默认由字段的值组成 | |
说明字段 | Caption Column | 组成层级成员的输出 Caption, 如果未设置说明字段成员说明取自名称字段, 名称字段也未设置则取自字段的值 | |
顺序字段 | Ordinal Column | 决定层级成员顺序的字段 | |
父级字段 | Parent Column | 当数据表记录为上下级结构时, 设置父级字段可以生成树状的成员结构 | |
父级字段空 | Null Parent Value | 判断父级成员是否存在的值, 默认为 null , 但有的数据库并不支持 null 值, 所以需要指定用 空字符串, 0 或 -1 代替 | |
表 | Table | 当层次结构是由多张表关联组成时, 需要为层级指定一个表名 | |
时间类型 | Level Time Type | 当维度为时间类型时需要设置每个层级的时间类型(表示了时间粒度) | |
隐藏成员 | Hide Member If | 隐藏成员的条件。如果一个层次有一个或多个带有隐藏成员的级别,那么不是所有的叶成员距离根的距离相同,这称为锯齿形层次。 | 1. 永不隐藏; 2. 名称为空时隐藏; 3. 名称与父级相同时隐藏; |
语义 | Semantics | 维度层级的语义, 增强维度层级的表达能力 | 语义设置 |
键表达式 | Key Expression | 表达式 | |
名称表达式 | Name Expression | 表达式 | |
说明表达式 | Caption Expression | 表达式 | |
顺序表达式 | Ordinal Expression | 表达式 | |
父字段表达式 | Parent Expression | 表达式 | |
闭合表 | Closure | 维度上下级层级关系时, 可以设置闭包表优化 SQL 运行效率 | 1. 表; 2. 父级字段; 3. 子级字段; |
层级属性 | Property | 层级的属性列表 | 1. 属性名称; 2. 属性字段; 3. 属性表达式 |
顺序字段
顺序字段 (Ordinal Column) 是用来排序层级成员的字段, 例如月份的顺序字段可以是月份的数字.
顺序字段属性指定层次结构表中的一列,该列提供给定级别中成员的顺序,而 名称字段 指定将显示的一列。
表达式
使用 SQL 表达式可以代替字段的设置, 以表达更丰富的计算功能. 例如 月 层级的说明字段可以使用以下表达式将年和月拼接显示出来:
CONCAT("the_year",' ',"the_month")
注意 SQL 表达式语法要与实际执行的数据库语法一致.
闭合表
当层级设置有父级字段时, 此层级成员为上下级结构的关系. 在计算汇总值时不确定深度的上下级成员会给性能带来挑战. 这时可以为上下级关系表指定一个闭合表以提高汇总值计算性能.
闭包表是一张SQL表,例如员工闭包表它包含每个员工/主管(所有上级主管, 无论深度如何)关系的记录。(数学术语中,这称为员工/主管关系的“自反传递闭包”。距离(distance)列并不严格要求,但它使填充表变得更容易。)
employee_closure | ||
---|---|---|
supervisor_id | employee_id | distance |
1 | 1 | 0 |
1 | 2 | 1 |
1 | 3 | 2 |
1 | 5 | 3 |
1 | 6 | 2 |
1 | 4 | 1 |
2 | 2 | 0 |
2 | 3 | 1 |
2 | 5 | 2 |
2 | 6 | 1 |
3 | 3 | 0 |
3 | 5 | 1 |
4 | 4 | 0 |
5 | 5 | 0 |
6 | 6 | 0 |
属性设置如下图
隐藏成员
维度通常由多层级组成,例如,地区 > 省份 > 城市,或公司 > 部门 > 员工。隐藏规则 规则用于判断某个层级下的成员是否需要在分析视图中隐藏,常见于组织结构、地理区域、产品分类等存在“空”、“跳层”或“冗余命名”的场景。
🎯 功能说明
成员隐藏规则支持以下几种逻辑,用于自动判断某个层级的成员是否应该在视图中被省略:
规则类型 | 说明 |
---|---|
永不隐藏 | 所有成员始终显示在分析结果中。适用于结构完整、数据一致的场景。 |
名称为空时隐藏 | 当成员的名称为空、空字符串或仅包含空格时,不显示该成员。适用于部分节点未命名或无意义的情况。 |
名称与父级相同时隐藏 | 如果当前成员的名称与其父级相同,则不显示该成员。常用于去除命名冗余,例如“总公司 > 总公司”的结构。 |
📚 应用示例
组织结构分析 某些员工直接归属于公司总部,无中间部门;此时若部门名称为空,可自动隐藏部门层级,避免展示空白节点。
产品分类展示 产品子类与父类名称相同的记录将被自动隐藏,使树状结构更清晰、避免重复信息干扰。
区域层级调整 若某些地区没有省级划分,仅包括国家和城市,可以通过该规则跳过省级层,保持分析一致性。
✅ 使用建议
- 当层级中可能存在 null、空字符串或仅包含空格的值时,建议启用“名称为空时隐藏”,以自动跳过无效节点,避免在分析结果中出现空白或无意义的成员。
- 当某一层级的成员名称经常与其父级相同,建议启用“名称与父级相同时隐藏”,以去除冗余展示、增强层级清晰度。
- 若维度结构完整、各层级数据规范,可保持默认“永不隐藏”,确保所有成员都被显示。