首页/数据/数仓建模速查/区间层次 Ragged Hierarchy
建模基础69 条

区间层次 Ragged Hierarchy

成员深度不齐且允许同层跳级时,用最低公共祖先与深度列配合区间表达;常见于类目与组织混合管理场景。

数仓建模速查数据更新于 2026-10-13

区间层次是什么

区间层次指成员深度不齐且允许同层跳级的结构,比如组织架构里某个部门直接挂在事业部下一层,或者类目里存在中间层缺位的分支。表达上通常用深度列配合祖先路径:深度列标注成员所在层级,路径列描述完整上级链,任意层级聚合时按深度列过滤即可。关键约定是跳级成员的归属:它算作哪一层参与汇总,必须在建模时与业务确认并文档化,否则层级汇总会互相打架。

基本信息

核心要素深度列 + 祖先路径(或桥接表)
主要用途按任意层级聚合,兼顾深度不齐的分支
必须约定跳级成员归属哪一层参与汇总
校验深度列与路径层数是否一致,是否存在孤岛分支

典型使用场景

  • 组织结构调整:合并拆分后部分部门跳级,深度列配合路径可稳定聚合
  • 类目体系治理:不同品类深度相差数级,需按深度分别统计
  • 区域划分:直辖市与省份并存时层级不一致,跳级归属需明确
  • 渠道体系分析:代理层级不齐,按深度过滤能得到各层规模
  • 口径评审:跳级成员的归属规则是评审必问项,需有文档结论

按深度聚合

按深度聚合
-- 按深度不超过两层的成员聚合(跳级成员按约定归层)
SELECT sum(f.amt) AS amt
FROM fact_sale f
JOIN dim_cat c ON f.cat_id = c.cat_id
WHERE c.depth_level <= 2;       -- 深度列决定参与汇总的层级

-- 校验:深度列是否与路径层数一致
SELECT cat_id, depth_level, path
FROM dim_cat
WHERE depth_level <> length(path) - length(replace(path, '/', '')) + 1;
-- 结果非空说明深度列与路径层数不匹配,需要回刷

跳级成员处理

情形处理方式影响
跳级且需计入上层按约定归入最近上层需在文档中写明规则
跳级且独立成层单列一层统计层级报表层数会多于预期
深度列滞后回刷深度与路径否则层级汇总与明细不一致
分支孤岛补上级关系或归入未知孤岛分支在层级汇总中整体消失
区间层次的聚合口径必须与业务确认,特别是跳级成员的归属。同一个部门算作二级还是三级,直接决定各层规模数字,且两种口径都能自圆其说。
深度列属于派生字段,一旦结构变化就要回刷。把它当作手工维护的静态字段,是层级汇总长期对不上明细的典型原因。

易错点

  • 跳级成员归属无约定:不同报表各按自己的理解归层,层级汇总互相矛盾
  • 深度列维护滞后于结构调整:汇总与明细长期存在无法解释的差额
  • 分支出现孤岛(无上级):层级汇总里整支数据消失,且不报错
  • 路径与深度列不一致:按深度过滤得到的层级与路径展示的层级不符

数据来源与参考

  • 维度建模实践:不规则层次
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌