如何在Teradata中统计Primary Flag为1的层级数据关联总数?
在Teradata中统计主节点的层级关联总数
问题背景
给定如下层级数据(通过Prev SerialNo关联父子节点,Primary Flag=1的是需要统计的主节点):
| Serial No | Primary Flag | Prev SerialNo |
|---|---|---|
| 101 | 1 | 56 |
| 56 | 0 | NULL |
| 505 | 0 | NULL |
| 223 | 1 | 156 |
| 156 | 0 | 93 |
| 93 | 0 | 42 |
| 42 | 0 | NULL |
需要统计每个Primary Flag=1的节点的整条关联链总长度(包含自身):
- 101关联到56,总长度为2
- 223关联到156→93→42,总长度为4
解决方案:使用递归CTE
Teradata支持递归WITH语句,可用于遍历层级结构并统计链长度,具体SQL如下:
WITH recursive_hierarchy AS ( -- 锚点成员:选取所有主节点,初始计数为1(包含自身) SELECT "Serial No" AS SerialNo, "Primary Flag" AS PrimaryFlag, "Prev SerialNo" AS PrevSerialNo, 1 AS hierarchy_count FROM your_table WHERE "Primary Flag" = 1 UNION ALL -- 递归成员:逐层遍历关联节点,计数累加 SELECT rh.SerialNo, rh.PrimaryFlag, t."Prev SerialNo", rh.hierarchy_count + 1 FROM recursive_hierarchy rh JOIN your_table t ON rh.PrevSerialNo = t."Serial No" ) -- 统计每个主节点的最长链长度 SELECT SerialNo, MAX(hierarchy_count) AS total_hierarchy_levels FROM recursive_hierarchy GROUP BY SerialNo ORDER BY SerialNo;
代码说明
- 锚点成员:筛选出所有
Primary Flag=1的行,将每个节点的初始层级计数设为1(代表自身)。 - 递归成员:通过
PrevSerialNo与下一层节点的Serial No关联,每次递归时将层级计数加1,直到PrevSerialNo为NULL(无法找到下一层节点)时停止递归。 - 最终统计:对每个主节点分组,取最大的层级计数,即为该节点整条关联链的总长度。
执行结果
运行上述SQL后,将得到如下结果:
| SerialNo | total_hierarchy_levels |
|---|---|
| 101 | 2 |
| 223 | 4 |
内容的提问来源于stack exchange,提问作者Leon35
相关产品推荐
相关产品推荐

