You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于多级数据利用Oracle SQL或Pandas生成层级结构

如何从两级节点数据生成完整层级结构

现有一组两级节点数据,其中节点1是父节点,节点2是子节点;但部分子节点(比如B1、B2、H9)同时也作为父节点存在于节点1中。以下分别通过Oracle SQL和Pandas DataFrame实现完整多级层级结构的生成:


Oracle SQL 实现方法

Oracle的递归公共表表达式(Recursive CTE)是处理层级遍历的标准方案,能自动递归关联多级父子关系:

假设原始表结构

假设你的数据存储在表node_hierarchy中,示例数据如下:

node1node2
AB1
AB2
B1C1
B1C2
B2D1
HH9
H9I1

递归查询代码

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 07:20:41