当前位置: 首页 > article >正文

从 SQL 到 SPL:分组后每组前面增加符合条件的记录

MSSQL 数据库某表具有多层级的自关联结构,第 2 个字段父节点 ID 是指向本表的第 1 个字段节点 ID 的外键,第 3 个字段是区域。

product_identifierparent_product_identifierZone
15E
26F
37G
48H
511R
612B
713C
814D
1115A

现在要找出上级层数大于等于 2 的那些节点的层级,以及最高层节点的区域,比如第 1 条记录的上级有 3 层,分别是 5-11-15,最高层是 15;第 2 条记录的上级有 2 层,分别是 6-12,最高层是 12。

product_identifierhierarchyZone
13A
22B
32C
42D
52A

SQL解法:

WITH dt AS (
  SELECT
    temp.product_identifier,
    temp.parent_product_identifier,
    temp.Zone,
    1 AS hierarchy,
    parent_product_identifier AS current_parent 
  FROM temp
  UNION ALL
  SELECT
     dt.product_identifier, 
     dt.parent_product_identifier, 
     temp.Zone, 
     dt.hierarchy+1, 
     temp.parent_product_identifier AS current_parent
  FROM dt
     INNER JOIN temp
     ON temp.product_identifier = dt.current_parent
)
SELECT 
  product_identifier,
  parent_product_identifier,
  hierarchy,
  Zone
FROM dt
WHERE hierarchy > 1 
AND hierarchy = (
   SELECT MAX(hierarchy) FROM dt dt2 
   WHERE dt2.product_identifier = dt.product_identifier) 
ORDER BY product_identifier;

只要找到各节点递归引用的所有层级,就可以方便地过滤出结果,但SQL没有直接可以用的函数,要用结构复杂的递归子查询+自关联join来实现,代码冗长难懂。

SPL提供了直接可用的函数,可以获得节点递归引用的所有层级。

 A
1=mssql.query("select product_identifier,parent_product_identifier,zone from temp order by product_identifier”)
2=A1.switch(parent_product_identifier, A1:product_identifier)
3=A2.derive(~.prior(parent_product_identifier):t, t.len():hierarchy, t.m(-1).zone:z)
4=A3.select(hierarchy>=2)
5=A4.new(product_identifier, hierarchy, z:zone)

A2:建立引用关系,将parent_product_identifier替换成外键指向的本表的记录。

A3:新增计算列,用prior函数计算出本节点递归引用的所有层级,这些层级的层数以及最后一个层级的区域。

A4:选出递归引用的所有层级的层数大于等于2的节点。

A5:生成目标结果集。

SPL以开源免费,欢迎前往乾学院了解更多!

源码地址

免费下载


http://www.kler.cn/a/466339.html

相关文章:

  • GESP202406 二级【计数】题解(AC)
  • 【linux基础I/O(1)】文件描述符的本质重定向的本质
  • 2025/1/1 路由期末复习作业二
  • 【网络安全 | 漏洞挖掘】绕过电子邮件确认实现预账户接管
  • 一文大白话讲清楚TCP连接的三次握手和断开连接的四次挥手的原理
  • 深入Android架构(从线程到AIDL)_10 主线程(UI 线程)的角色
  • 分布式练手:Server
  • 如何得到深度学习模型的参数量和计算复杂度
  • 【图像处理】OpenCv + Python 实现 Photoshop 中的色彩平衡功能
  • 机器学习经典算法——逻辑回归
  • 在K8S中,Pod请求另一个Pod偶尔出现超时或延迟,如何排查?
  • 【LeetCode】803、打砖块
  • BurpSuite2024.11
  • JLINK V9插入电脑没反应
  • 基于深度学习的视觉检测小项目(二) 环境和框架搭建
  • pytorch张量高级索引介绍
  • Sublime Text4 4189 安装激活【 2025年1月3日 亲测可用】
  • LLM 中的 Decoder Only
  • df.set_index(‘name‘).groupby(‘team‘).apply(first_3, ‘Q1‘)
  • 被催更了,2025元旦源码继续免费送
  • 一文讲清楚webpack和vite原理
  • Vue 快速入门:开启前端新征程
  • 像品茶一样品设计模式,早日突破编码新境界。
  • 2025 年软件行业展望:除了 AI,还有更多精彩
  • STM32CUBE快速入门02
  • 免费下载 | 2024网络安全产业发展核心洞察与趋势预测