如何基于多级数据利用Oracle SQL或Pandas生成层级结构
如何从两级节点数据生成完整层级结构
现有一组两级节点数据,其中节点1是父节点,节点2是子节点;但部分子节点(比如B1、B2、H9)同时也作为父节点存在于节点1中。以下分别通过Oracle SQL和Pandas DataFrame实现完整多级层级结构的生成:
Oracle SQL 实现方法
Oracle的递归公共表表达式(Recursive CTE)是处理层级遍历的标准方案,能自动递归关联多级父子关系:
假设原始表结构
假设你的数据存储在表node_hierarchy中,示例数据如下:
| node1 | node2 |
|---|---|
| A | B1 |
| A | B2 |
| B1 | C1 |
| B1 | C2 |
| B2 | D1 |
| H | H9 |
| H9 | I1 |
递归查询代码
WITH recursive_hierarchy AS ( -- 锚点成员:筛选所有顶级父节点(仅在node1出现、不在node2中存在的节点) SELECT node1 AS parent_node, node2 AS child_node, 1 AS level, CAST(node1 || '->' || node2 AS VARCHAR2(1000)) AS path FROM node_hierarchy WHERE node1 NOT IN (SELECT node2 FROM node_hierarchy) UNION ALL -- 递归成员:迭代关联子节点与下一级父节点 SELECT rh.child_node AS parent_node, nh.node2 AS child_node, rh.level + 1 AS level, CAST(rh.path || '->' || nh.node2 AS VARCHAR2(1000)) AS path FROM recursive_hierarchy rh JOIN node_hierarchy nh ON rh.child_node = nh.node1 ) SELECT parent_node, child_node, level, path FROM recursive_hierarchy ORDER BY level, path;
关键说明
- 锚点成员:定位层级的起始节点,确保从最顶层开始遍历
- 递归成员:不断将当前子节点作为下一级父节点,直到没有后续子节点为止
level标记节点所在层级,path展示完整的父子链路,便于直观查看层级关系
Pandas DataFrame 实现方法
通过递归函数遍历父子关系,逐步构建完整层级结构:
示例数据准备
import pandas as pd # 构造示例数据集 data = { 'node1': ['A', 'A', 'B1', 'B1', 'B2', 'H', 'H9'], 'node2': ['B1', 'B2', 'C1', 'C2', 'D1', 'H9', 'I1'] } df = pd.DataFrame(data)
层级构建函数
def build_hierarchy(df): # 筛选顶级父节点(不在node2列中的node1值) top_parents = df[~df['node1'].isin(df['node2'])]['node1'].unique() hierarchy_list = [] def traverse(parent, current_level, path): # 获取当前父节点的所有子节点 children = df[df['node1'] == parent]['node2'].tolist() for child in children: new_path = f"{path}->{child}" if path else parent + "->" + child hierarchy_list.append({ 'parent_node': parent, 'child_node': child, 'level': current_level, 'path': new_path }) # 递归遍历子节点的下一级 traverse(child, current_level + 1, new_path) # 遍历所有顶级节点,启动递归 for parent in top_parents: traverse(parent, 1, parent) return pd.DataFrame(hierarchy_list) # 生成并查看结果 result_df = build_hierarchy(df) print(result_df.sort_values(['level', 'path']))
关键说明
- 先定位顶级父节点作为遍历起点
- 递归函数
traverse会逐层遍历每个节点的子节点,记录层级、路径等信息 - 最终返回的DataFrame可通过
level和path排序,清晰展示多级结构
内容的提问来源于stack exchange,提问作者Osceria
相关产品推荐
相关产品推荐

