文章目录

  • 概述
  • SQL 中的递归实现
  • 题目一:分析组织层级
  • 题解
  • 题目二:树节点求解
  • 题解
    • 步骤一:通过递归查询出每个节点的上级节点和下级节点分布
    • 步骤二:分组统计

概述

最近刷题时遇到了一道需要根据组织层级来统计各个层级的一些数据,当时碰到时的第一想法就是需要使用递归来实现。但是以前在SQl中从来就没有用过递归查询,后面到网上一搜索,居然还真有递归查询的实现,也算是给自己扫了一下盲了。

SQL 中的递归实现

递归是一种通过自身调用自身来 逐步推理出计算结果的一种思想。在SQL中递归查询同样也是如此,通过自身调用自身来逐步构建查询结果。一般多用于处理具有层次结构的数据,如树形结构、组织结构图、文件系统目录等。
在SQL中,使用 WITH RECURSIVE 关键字来实现。

同编程语言中的递归函数调用类似,递归查询的执行过程也需要遵循以下三个原则:

  • 初始查询
    首次执行初始查询 ,得到一个初始结果集。
  • 递归调用
    将初始结果集作为输入,执行递归查询,并将递归查询的结果与初始结果集合并,作为下一次查询的输入。
  • 终止条件
    重复执行递归查询,直到没有新的行可以添加到结果集中,递归查询终止。
    递归查询的语法如下:
    WITH RECURSIVE table_name AS (--初始查询SELECT 1 AS level FROM XXX WHERE XXXUNION ALL--递归查询SELECT level+1  FROM table_name WHERE XXXX--终止条件是查询到所有的记录都做了处理,递归终止 )

例如使用递归生成一个连续的序列:

-- 递归查询生成数字序列
WITH RECURSIVE lianxu_numbers AS (-- 初始查询,生成第一个数字 1SELECT 1 AS numUNION ALL-- 递归查询(递归成员):生成下一个数字SELECT num + 1FROM lianxu_numbersWHERE num < 100 -- 小于100 是终止条件
)
SELECT * FROM numbers;

题目一:分析组织层级

表:Employees+----------------+---------+
| Column Name    | Type    | 
+----------------+---------+
| employee_id    | int     |
| employee_name  | varchar |
| manager_id     | int     |
| salary         | int     |
| department     | varchar |
+----------------+----------+
employee_id 是这张表的唯一主键。
每一行包含关于一名员工的信息,包括他们的 ID,姓名,他们经理的 ID,薪水和部门。
顶级经理(CEO)的 manager_id 是空的。
编写一个解决方案来分析组织层级并回答下列问题:层级:对于每名员工,确定他们在组织中的层级(CEO 层级为 1,CEO 的直接下属员工层级为 2,以此类推)。
团队大小:对于每个是经理的员工,计算他们手下的(直接或间接下属)总员工数。
薪资预算:对于每个经理,计算他们控制的总薪资预算(所有手下员工的工资总和,包括间接下属,加上自己的工资)。
返回结果表以 层级 升序 排序,然后以预算 降序 排序,最后以 employee_name 升序 排序。结果格式如下所示。示例:输入:Employees 表:+-------------+---------------+------------+--------+-------------+
| employee_id | employee_name | manager_id | salary | department  |
+-------------+---------------+------------+--------+-------------+
| 1           | Alice         | null       | 12000  | Executive   |
| 2           | Bob           | 1          | 10000  | Sales       |
| 3           | Charlie       | 1          | 10000  | Engineering |
| 4           | David         | 2          | 7500   | Sales       |
| 5           | Eva           | 2          | 7500   | Sales       |
| 6           | Frank         | 3          | 9000   | Engineering |
| 7           | Grace         | 3          | 8500   | Engineering |
| 8           | Hank          | 4          | 6000   | Sales       |
| 9           | Ivy           | 6          | 7000   | Engineering |
| 10          | Judy          | 6          | 7000   | Engineering |
+-------------+---------------+------------+--------+-------------+
输出:+-------------+---------------+-------+-----------+--------+
| employee_id | employee_name | level | team_size | budget |
+-------------+---------------+-------+-----------+--------+
| 1           | Alice         | 1     | 9         | 84500  |
| 3           | Charlie       | 2     | 4         | 41500  |
| 2           | Bob           | 2     | 3         | 31000  |
| 6           | Frank         | 3     | 2         | 23000  |
| 4           | David         | 3     | 1         | 13500  |
| 7           | Grace         | 3     | 0         | 8500   |
| 5           | Eva           | 3     | 0         | 7500   |
| 9           | Ivy           | 4     | 0         | 7000   |
| 10          | Judy          | 4     | 0         | 7000   |
| 8           | Hank          | 4     | 0         | 6000   |
+-------------+---------------+-------+-----------+--------+
解释:组织结构:
Alice(ID:1)是 CEO(层级 1)没有经理。
Bob(ID:2)和 Charlie(ID:3)是 Alice 的直接下属(层级 2)
David(ID:4),Eva(ID:5)从属于 Bob,而 Frank(ID:6)和 Grace(ID:7)从属于 Charlie(层级 3)
Hank(ID:8)从属于 David,而 Ivy(ID:9)和 Judy(ID:10)从属于 Frank(层级 4)
层级计算:
CEO(Alice)层级为 1
每个后续的管理层级都会使层级数加 1
团队大小计算:
Alice 手下有 9 个员工(除她以外的整个公司)
Bob 手下有 3 个员工(David,Eva 和 Hank)
Charlie 手下有 4 个员工(Frank,Grace,Ivy 和 Judy)
David 手下有 1 个员工(Hank)
Frank 手下有 2 个员工(Ivy 和 Judy)
Eva,Grace,Hank,Ivy 和 Judy 没有直接下属(team_size = 0)
预算计算:
Alice 的预算:她的工资(12000)+ 所有员工的工资(72500)= 84500
Charlie 的预算:他的工资(10000)+ Frank 的预算(23000)+ Grace 的工资(8500)= 41500
Bob 的预算:他的工资 (10000) + David 的预算(13500)+ Eva 的工资(7500)= 31000
Frank 的预算:他的工资 (9000) + Ivy 的工资(7000)+ Judy 的工资(7000)= 23000
David 的预算:他的工资 (7500) + Hank 的工资(6000)= 13500
没有直接下属的员工的预算等于他们自己的工资。
注意:结果先以层级升序排序
在同一层级内,员工按预算降序排序,然后按姓名升序排序

题解

with recursive a1 as (select employee_id,manager_id,1 as afrom employeesunion allselect a1.employee_id,e.manager_id,a+1from employees e  join a1 on a1.manager_id=e.employee_id
)
,
--level:层级
a2 as (select employee_id, count(*) levelfrom a1group by employee_id)/*level*/
,
--下属人数
a3 as (select manager_id, count(*) team_sizefrom a1where manager_id is not nullgroup by manager_id)/*size*/
,
--工资统计
a4 as (select a1.manager_id, sum(salary) budgetfrom a1left join employees e using (employee_id)where a1.manager_id is not nullgroup by a1.manager_id
)select employee_id,employee_name,level,ifnull(team_size,0) team_size,salary+ifnull(budget,0) budget
from a2 left join employees using(employee_id)
left join a3 on a2.employee_id=a3.manager_id
left join a4 on a2.employee_id=a4.manager_id
order by level,budget desc,employee_name;

题目二:树节点求解

表:Tree+-------------+------+
| Column Name | Type |
+-------------+------+
| id          | int  |
| p_id        | int  |
+-------------+------+
id 是该表中具有唯一值的列。
该表的每行包含树中节点的 id 及其父节点的 id 信息。
给定的结构总是一个有效的树。树中的每个节点可以是以下三种类型之一:"Leaf":节点是叶子节点。
"Root":节点是树的根节点。
"lnner":节点既不是叶子节点也不是根节点。
编写一个解决方案来报告树中每个节点的类型。以 任意顺序 返回结果表。结果格式如下所示。示例 1:输入:
Tree table:
+----+------+
| id | p_id |
+----+------+
| 1  | null |
| 2  | 1    |
| 3  | 1    |
| 4  | 2    |
| 5  | 2    |
+----+------+
输出:
+----+-------+
| id | type  |
+----+-------+
| 1  | Root  |
| 2  | Inner |
| 3  | Leaf  |
| 4  | Leaf  |
| 5  | Leaf  |
+----+-------+
解释:
节点 1 是根节点,因为它的父节点为空,并且它有子节点 2 和 3。
节点 2 是一个内部节点,因为它有父节点 1 和子节点 4 和 5。
节点 3、4 和 5 是叶子节点,因为它们有父节点而没有子节点。

题解

步骤一:通过递归查询出每个节点的上级节点和下级节点分布

with recursive a1 AS (select id,p_id, 1 as level from Treeunion allselect a1.id,e.p_id, level+1 as level from Tree e join a1 on a1.p_id = e.id
)
select * from a1;

输出:

| id | p_id | level |
| -- | ---- | ----- |
| 1  | null | 1     |
| 2  | 1    | 1     |
| 3  | 1    | 1     |
| 4  | 2    | 1     |
| 5  | 2    | 1     |
| 3  | null | 2     |
| 2  | null | 2     |
| 5  | 1    | 2     |
| 4  | 1    | 2     |
| 4  | null | 3     |
| 5  | null | 3     |

得到上面这张零时表后,就可以根据这张临时表统计出每个节点的下级节点的数量,每个节点所在的层次。

步骤二:分组统计

  • 统计节点所在层级
select id, count(*) as level from a1 group by id;
  • 统计几点的下级节点(包括间接节点)的数量
select p_id, count(*) as son_nums from a1 where p_id is not null group by p_id;

子节点数为0的节点就为叶子节点。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/78944.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/78944.shtml
英文地址,请注明出处:http://en.pswp.cn/bicheng/78944.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL 语法与基础完全指南

MySQL 是最流行的开源关系型数据库管理系统之一&#xff0c;广泛应用于 Web 应用程序开发。本文将全面介绍 MySQL 的基础知识和完整语法结构。 一、MySQL 基础概念 1. 数据库基本术语 数据库(Database): 存储数据的集合 表(Table): 数据以表格形式组织 列(Column): 表中的一…

【Sqlalchemy Model转换成Pydantic Model示例】

【Sqlalchemy Model转换成Pydantic Model示例】 由于Sqlalchemy和Pydantic的模型字段类型可能有差异, 所以需要一个通用的装换类 def sqlalchemy_to_pydantic_v2(sqlalchemy_model, pydantic_model):"""通用函数&#xff0c;将 SQLAlchemy 模型实例转换为 Pyd…

2025年欧洲西南部大停电

2025年4月28日&#xff0c;欧洲西南部出现大规模停电&#xff0c;西班牙、葡萄牙和法国南部均受到影响。有报道指出停电可能与 欧洲电网出现问题有关&#xff0c;但最终原因尚未确定。由于停电&#xff0c;上述地区的交通和通信服务均受到严重影响&#xff0c;交通信号灯停止工…

Java EE初阶——计算机是如何工作的

1. cpu 冯诺依曼体系&#xff08;Von Neumann Architecture&#xff09; • CPU 中央处理器: 进⾏算术运算和逻辑判断. • 存储器: 分为外存和内存, ⽤于存储数据(使⽤⼆进制⽅式存储) • 输⼊设备: ⽤⼾给计算机发号施令的设备. • 输出设备: 计算机个⽤⼾汇报结果的设…

飞鸟游戏模拟器 1.0.3 | 完全免费无广告,内置大量经典童年游戏,重温美好回忆

飞鸟游戏模拟器是一款专为安卓用户设计的免费游戏模拟器&#xff0c;内置了大量经典的童年游戏。该模拟器拥有丰富的游戏资源&#xff0c;目前已有约20,000款游戏&#xff0c;包括多种类型如冒险、动作、角色扮演等。用户可以直接搜索查找想要玩的游戏进行下载并启动。游戏库中…

网络爬取需谨慎:警惕迷宫陷阱

一、技术背景:网络爬虫与数据保护的博弈升级 1. 问题根源:AI训练数据爬取的无序性 数据需求爆炸:GPT-4、Gemini等大模型依赖数万亿网页数据训练,但大量爬虫无视网站的robots.txt协议(非法律强制),未经许可抓取内容(如新闻、学术论文、代码),引发版权争议(如OpenAI被…

Qwen3简介:大型语言模型的革命

Qwen3简介&#xff1a;大型语言模型的革命 Qwen系列语言模型的最新发布——Qwen3&#xff0c;标志着人工智能&#xff08;AI&#xff09;技术的一次重大飞跃。基于前代版本的成功&#xff0c;Qwen3在架构、推理能力和多项先进功能上都取得了显著提升&#xff0c;正在重新定义大…

MODSIM选型指南:汽车与航空航天企业如何选择仿真平台

1. 引言 在竞争激烈的汽车与航空航天领域&#xff0c;仿真技术已成为产品研发不可或缺的环节。通过在设计阶段验证概念并优化性能&#xff0c;仿真平台能有效缩短开发周期并降低物理样机制作成本。 MODSIM&#xff08;建模与仿真&#xff09;作为达索系统3DEXPERIENCE平台的核…

linux 内核 debugfs 使用介绍

一&#xff1a;概述 debugfs 是 Linux 内核提供的一个特殊的虚拟文件系统&#xff0c;用于 暴露内核模块&#xff08;如驱动&#xff09;内部的调试信息或控制接口&#xff0c;供开发者、调试人员实时查看和排查问题。即 debugfs 就是一个“调试专用的 /proc 或 /sys”&#xf…

ZYNQ笔记(十五):PL读写PS DDR(自定义IP核-AXI4接口)

版本&#xff1a;Vivado2020.2&#xff08;Vitis&#xff09; 任务&#xff1a;PL 端自定义一个 AXI4 接口的 IP 核&#xff0c;通过 AXI_HP 接口对 PS 端 DDR3 进行读写 测试&#xff0c;读写的内存大小是 4K 字节&#xff0c; 目录 一、介绍 &#xff08;1&#xff09;…

Redis 小记

Redis 命令小记 Redis 是一个文本/二进制数据库&#xff08;textual/binary database&#xff09; CLI 命令 redis-cli, redis-server, redis-benchmark, redis-check-dump, redis-check-aof redis-cli 执行命令 # 方式 1 redis-cli -h 127.0.0.1 -p 6379 > 127.0.0.1:63…

如何在idea中编写spark程序

在 IntelliJ IDEA 中编写 Spark 程序的详细指南 在大数据处理领域&#xff0c;Apache Spark 凭借其强大的分布式计算能力&#xff0c;成为了众多开发者的首选工具。而 IntelliJ IDEA 作为一款功能强大的集成开发环境&#xff08;IDE&#xff09;&#xff0c;为编写 Spark 程序…

各类神经网络学习:(十一)注意力机制(第3/4集),位置编码

上一篇下一篇注意力机制&#xff08;2/4集&#xff09;注意力机制&#xff08;4/4集&#xff09; 位置编码 R N N RNN RNN 和 L S T M LSTM LSTM 这些网络都是串行执行的&#xff0c;在潜移默化中&#xff0c;就包含了顺序关系&#xff0c;也就是词序关系。而注意力机制是并行…

《Python Web部署应知应会》Flask网站隐藏或改变浏览器URL:从Nginx反向代理到URL重写技术

Flask网站隐藏或改变浏览器显示URL地址的实现方案&#xff1a;从Nginx反向代理到URL重写技术 引言 在Web应用开发中&#xff0c;URL路径的安全性往往被忽视&#xff0c;这可能导致网站结构和后端逻辑被攻击者轻易推断。对于Flask框架开发的网站&#xff0c;如何隐藏或改变浏览…

elementui里的el-tabs的内置样式修改失效?

1.问题图 红框里的是组件的内置样式&#xff0c;红框下的是自定义样式 2.分析 2.1scoped vue模板编译器在编译有scoped的stye标签时&#xff0c;会生成对应的postCSS插件&#xff0c;该插件会给每个scoped标记的style标签模块&#xff0c;生成唯一一个对应的 data-v-xxxhash…

大数据测试集群环境部署

Hadoop大数据集群搭建&#xff08;超详细&#xff09;_hadoop_小飞飞519-GitCode 开源社区 hadoop集群一之虚拟机安装(mac)_hadoop_皮皮虾不皮呀-华为开发者空间 hadoop集群二之hadoop安装_hadoop_皮皮虾不皮呀-华为开发者空间 虚拟机如何查看gateway | PingCode智库

Nginx 核心功能笔记

目录 一、Nginx 简介 二、核心功能详解 三、关键指令解析 四、性能优化要点 五、常见应用场景 一、Nginx 简介 定位 高性能的 HTTP/反向代理服务器&#xff0c;同时支持邮件协议代理&#xff08;IMAP/POP3/SMTP&#xff09;。采用 事件驱动、异步非阻塞 架构&#xff0c;…

强化学习(二)马尔科夫决策过程(MDP)

1. 简介 马尔可夫决策过程正式地描述了强化学习的环境其中环境是完全可观测的即当前状态完全表征了这个过程几乎所有的强化学习问题都可以形式化为马尔可夫决策过程&#xff0c;例如&#xff1a; 最优控制主要处理连续的马尔可夫决策过程部分可观察的问题可以转化为马尔可夫决…

Day16(贪心算法)——LeetCode45.跳跃游戏II763.划分字母区间

1 LeetCode45.跳跃游戏II 1.1 题目描述 与跳跃游戏类似&#xff0c;跳跃游戏II给定长为n的从0开始索引的整数数组nums&#xff0c;nums[i]是你在i处能向右跳跃的最大步数&#xff0c;求到达数组最后一个索引处需要跳跃的最少次数。   一个示例&#xff1a;nums[2,3,1,1,4]&a…

告别碎片化!两大先进分块技术如何提升RAG的语义连贯性?

研究动机 论文核心问题及研究背景分析 1. 研究领域及其重要性 研究领域&#xff1a;检索增强生成&#xff08;Retrieval-Augmented Generation, RAG&#xff09;系统&#xff0c;结合自然语言处理&#xff08;NLP&#xff09;与信息检索技术。重要性&#xff1a; RAG通过动态…