惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Jina AI
Jina AI
S
SegmentFault 最新的问题
D
DataBreaches.Net
H
Help Net Security
有赞技术团队
有赞技术团队
M
MIT News - Artificial intelligence
Martin Fowler
Martin Fowler
IT之家
IT之家
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
腾讯CDC
罗磊的独立博客
Y
Y Combinator Blog
阮一峰的网络日志
阮一峰的网络日志
云风的 BLOG
云风的 BLOG
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
WordPress大学
WordPress大学
Microsoft Security Blog
Microsoft Security Blog
J
Java Code Geeks
Vercel News
Vercel News
Hugging Face - Blog
Hugging Face - Blog
aimingoo的专栏
aimingoo的专栏
Stack Overflow Blog
Stack Overflow Blog
Recent Announcements
Recent Announcements
博客园 - 三生石上(FineUI控件)

博客园 - _herbert

小程序拍证件并局部裁剪 信创-为什么ORACLE使用JDBC查询SYSDATE时,RS.getDate能获取到时间部分? linux宝塔面板使用API自动部署更新文件 JSON JAVA找出哪个类import了不存在的类 LocalDate,LocalDateTime,Date,日期串相互转换 PostMan加载三方JS PostMan内置对象 微信支付集成_JSAPI VUE中使用AXIOS包装API代理 spring中el表达式安全和扩展 Spring使用el表达式 springboot中File默认路径 Springboot启动时记录进程ID ORACLE解析游标生成JSON ORACLE游标序列化 Springboot构建包使用BOOT-INF中的class覆盖依赖包中的class Maven 构建知识库 MAVEN构建分离依赖JAR JAVA实现读取最后几行日志 信创-ORACLE迁移到KingbaseV9 信创-ORACLE迁移到DM8 sql分组 group by rollup,cube,grouping sets,group_id,groupingId
AI教我一条SQL实现明细转树形结构
_herbert · 2025-11-03 · via 博客园 - _herbert

AI教我一条SQL实现明细转树形结构

1. 原始数据

序号 COUNTRY PROVINCE CITY GAME
1 中国 广东 深圳 地心侠士
2 中国 广东 广州 地心侠士
3 中国 江苏 南京 地心侠士
4 美国 加州 洛杉矶 地心侠士

2. 目标数据

序号 节点名称 节点ID 父级节点ID 国家 城市 微信小游戏
1 美国 美国 0 美国
2 加州 美国加州 美国 美国 加州
3 洛杉矶 美国加州洛杉矶 美国加州 美国 加州 洛杉矶 地心侠士
4 中国 中国 0 中国
5 广东 中国广东 中国 中国 广东
6 广州 中国广东广州 中国广东 中国 广东 广州 地心侠士
7 深圳 中国广东深圳 中国广东 中国 广东 深圳 地心侠士
8 江苏 中国江苏 中国 中国 江苏
9 南京 中国江苏南京 中国江苏 中国 江苏 南京 地心侠士

3. 实现思路

从一个明细数据,提取多余的父级信息,可以使用不同维度的分组进行提取.可以逐层获取,也可以使用GROUPING SETS
减少分组代码量.比如以上提供的目标数据中可以如下汇总实现:

  • 汇总国家层级,按照country分组汇总,得到中国,美国,两条数据
  • 汇总省份层级,按照country,province,得到中国广东,中国江苏,美国加州三条数据
  • 汇总明细数据,直接按照所有列进行分组,得到明细数据

以上步骤,可以解决数据问题,但是数据之间的层级关系体现不出来,需要添加三列,分别表示节点名称,节点ID,父级节点ID
可以说使用分组函数GROUPING_ID实现,分组列为二进制,包含分组为0不包含为1,国家,省,明细三个分组值依次为

  • 汇总国家层级 GROUPING_ID(country, province, city),二进制 011 十进制 3,节点名称 country 节点ID country 父级节点ID '0'
  • 汇总省份层级 GROUPING_ID(country, province, city),二进制 001 十进制 1,节点名称 province 节点ID country||province 父级节点ID country
  • 汇总明细层级 GROUPING_ID(country, province, city),二进制 000 十进制 0,节点名称 city 节点ID country||province||city 父级节点ID country||province

分组函数详细参考可以查看 sql分组 group by rollup,cube,grouping sets,group_id,groupingId

WITH region_data AS (
  SELECT '中国' as country, '广东' as province, '深圳' as city ,'地心侠士' as game FROM dual UNION ALL 
  SELECT '中国', '广东', '广州' ,'地心侠士' FROM dual UNION ALL
  SELECT '中国', '江苏', '南京','地心侠士' FROM dual UNION ALL
  SELECT '美国', '加州', '洛杉矶','地心侠士' FROM dual
)
SELECT 
    CASE 
        WHEN GROUPING_ID(country, province, city) = 0 THEN city
        WHEN GROUPING_ID(country, province, city) = 1 THEN province
        WHEN GROUPING_ID(country, province, city) = 3 THEN country
    END AS 节点名称,
   CASE 
        WHEN GROUPING_ID(country, province, city) = 0 THEN country||province||city
        WHEN GROUPING_ID(country, province, city) = 1 THEN country||province
        WHEN GROUPING_ID(country, province, city) = 3 THEN country
    END AS 节点ID,
     CASE 
        WHEN GROUPING_ID(country, province, city) = 0 THEN country||province
        WHEN GROUPING_ID(country, province, city) = 1 THEN country
        WHEN GROUPING_ID(country, province, city) = 3 THEN '0'
    END AS 父级节点ID,
    country AS 国家,
    province AS 省,
    city AS 城市,
    game as 微信小游戏
FROM region_data
GROUP BY GROUPING SETS (
    (country, province, city,game),
    (country, province),     
    (country)               
)
ORDER BY country, province nulls first, city nulls first;

前端构造树形结构数据,传递给前端有时有特殊字符,方便处理,可以统一转换成16进制串,针对节点ID,父级节点ID,

  function NODEID_TO_RAWID(str in varchar2) return varchar2 is
    new_str varchar2(1000);
    -- 微信公众: 小满小慢 20251113
  begin
    new_str:=UTL_RAW.CAST_TO_RAW(str);
    return new_str;
  end;

4. 总结

实现过程使用AI辅助生成测试代码,通过一次交互提示词,返回目标代码.关注微信公众号[小满小慢],回复关键词AIGROUP可获取具体提示内容.

原文地址: https://mp.weixin.qq.com/s/9_A6cgohb8sX1N0RME0usQ