LeetCode_sql刷題(3482.分析組織層級)

題目描述:3482. 分析組織層級 - 力扣(LeetCode)

表:Employees

+----------------+---------+
| Column Name    | Type    | 
+----------------+---------+
| employee_id    | int     |
| employee_name  | varchar |
| manager_id     | int     |
| salary         | int     |
| department     | varchar |
+----------------+----------+
employee_id 是這張表的唯一主鍵。
每一行包含關于一名員工的信息,包括他們的 ID,姓名,他們經理的 ID,薪水和部門。
頂級經理(CEO)的 manager_id 是空的。

編寫一個解決方案來分析組織層級并回答下列問題:

  1. 層級:對于每名員工,確定他們在組織中的層級(CEO 層級為?1,CEO 的直接下屬員工層級為?2,以此類推)。
  2. 團隊大小:對于每個是經理的員工,計算他們手下的(直接或間接下屬)總員工數。
  3. 薪資預算:對于每個經理,計算他們控制的總薪資預算(所有手下員工的工資總和,包括間接下屬,加上自己的工資)。

返回結果表以?層級?升序?排序,然后以預算?降序?排序,最后以?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
    • 沒有直接下屬的員工的預算等于他們自己的工資。

注意:

  • 結果先以層級升序排序
  • 在同一層級內,員工按預算降序排序,然后按姓名升序排序
數據準備
CREATE TABLE if not exists Employees (employee_id INT,employee_name VARCHAR(100),manager_id INT,salary INT,department VARCHAR(50)
)
Truncate table Employees
insert into Employees (employee_id, employee_name, manager_id, salary, department) values ('1', 'Alice', NULL, '12000', 'Executive')
insert into Employees (employee_id, employee_name, manager_id, salary, department) values ('2', 'Bob', '1', '10000', 'Sales')
insert into Employees (employee_id, employee_name, manager_id, salary, department) values ('3', 'Charlie', '1', '10000', 'Engineering')
insert into Employees (employee_id, employee_name, manager_id, salary, department) values ('4', 'David', '2', '7500', 'Sales')
insert into Employees (employee_id, employee_name, manager_id, salary, department) values ('5', 'Eva', '2', '7500', 'Sales')
insert into Employees (employee_id, employee_name, manager_id, salary, department) values ('6', 'Frank', '3', '9000', 'Engineering')
insert into Employees (employee_id, employee_name, manager_id, salary, department) values ('7', 'Grace', '3', '8500', 'Engineering')
insert into Employees (employee_id, employee_name, manager_id, salary, department) values ('8', 'Hank', '4', '6000', 'Sales')
insert into Employees (employee_id, employee_name, manager_id, salary, department) values ('9', 'Ivy', '6', '7000', 'Engineering')
insert into Employees (employee_id, employee_name, manager_id, salary, department) values ('10', 'Judy', '6', '7000', 'Engineering')

分析

①使用recursive進行遞歸查詢 通過引用 CTE 自身不斷生成新的結果集,直到滿足終止條件主表 employee_id 和 子表manager_id 連接條件 直到employee_id遍歷完? 通過子表employee_id 記錄路徑,level記錄層級?

with recursive t1 as (select employee_id,employee_name,1                         as level,CAST(employee_id AS CHAR) as path,salary,department,manager_idfrom Employeeswhere manager_id is nullunionselect t2.employee_id,t2.employee_name,1 + t1.level,concat(t1.path, ',', t2.employee_id) as path,t2.salary,t2.department,t2.manager_idfrom Employees t2join t1on t2.manager_id = t1.employee_id)
select * from t1

②根據路徑 展開主表和子表 將主表employee_id下的所有子員工都展開

select e.employee_id as m_id, e2.employee_id, e2.salaryfrom t1 ejoin t1 e2 on e2.path like concat(e.path, '%')

③根據主employee_id? 計算team_size團隊人數和budget預算

select m_id, (count(m_id) - 1) as team_size, sum(salary) as budgetfrom t3group by m_id

④將結果進行連接 排序

代碼
with recursive t1 as (select employee_id,employee_name,1                         as level,CAST(employee_id AS CHAR) as path,salary,department,manager_idfrom Employeeswhere manager_id is nullunionselect t2.employee_id,t2.employee_name,1 + t1.level,concat(t1.path, ',', t2.employee_id) as path,t2.salary,t2.department,t2.manager_idfrom Employees t2join t1on t2.manager_id = t1.employee_id)
# select * from t1, t3 as (select e.employee_id as m_id, e2.employee_id, e2.salaryfrom t1 ejoin t1 e2 on e2.path like concat(e.path, '%')), t4 as (select m_id, (count(m_id) - 1) as team_size, sum(salary) as budgetfrom t3group by m_id)
select employee_id, employee_name, level, team_size, budget
from t1left join t4 on employee_id = m_id
order by level, budget desc, employee_name;-- 合并
with recursive employee as(select employee_id, employee_name, manager_id, salary, 1 as level, cast(employee_id as char) as pathfrom Employeeswhere manager_id is nullunionselect e2.employee_id,e2.employee_name,e2.manager_id,e2.salary,1 + employee.level,concat(employee.path, ',', e2.employee_id)from Employees e2join employee one2.manager_id = employee.employee_id)
# select * from
, t3 as(select e1.employee_id ,e2.employee_id as emp,e1.employee_name,e1.level,e2.salary from employee e1 left join employee e2 on  e2.path like concat(e1.path,'%')
)
select employee_id,employee_name,level,(count(employee_id)-1) as team_size,sum(salary)'budget'  from t3
group by employee_id, employee_name,level
order by level,budget desc,employee_name
;
總結

①遞歸查詢基本結構

WITH RECURSIVE cte_name (column_list) AS (-- 錨成員(初始查詢)SELECT ...UNION [ALL]-- 遞歸成員(遞歸查詢)SELECT ...
)
SELECT * FROM cte_name;
  • 錨成員:返回初始結果集。
  • 遞歸成員:通過引用 CTE 自身不斷生成新的結果集,直到滿足終止條件。

②執行順序分析

遞歸查詢的執行遵循?迭代模型,步驟如下:

步驟 1:執行錨成員
  • 錨查詢首先執行,生成遞歸的基礎結果集(R0)。
步驟 2:執行遞歸成員
  • 將遞歸成員應用于上一次迭代的結果集(初始為 R0),生成新的結果集(R1)。
  • 去重處理:如果使用?UNION(而非?UNION ALL),會自動刪除重復行。
步驟 3:檢查終止條件
  • 如果新生成的結果集(R1)為空,遞歸終止。
  • 否則,將 R1 作為下一次迭代的輸入,重復步驟 2。
步驟 4:合并所有結果
  • 遞歸終止后,將所有迭代的結果集合并(隱式使用?UNION ALL),返回最終結果。

③ 強轉為字符串才可以進行拼接

 cast(employee_id as char)

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/80344.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/80344.shtml
英文地址,請注明出處:http://en.pswp.cn/web/80344.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

工業場景輪式巡檢機器人純視覺識別導航的優勢剖析與前景展望

一、引言 1.1 研究背景與意義 在工業 4.0 的大背景下,工業生產的智能化、自動化水平不斷提高,對工業場景的巡檢工作提出了更高的要求。傳統的人工巡檢方式不僅效率低下、成本高昂,而且容易受到人為因素的影響,難以滿足現代工業生…

《棒球萬事通》球類運動有哪些項目·棒球1號位

以棒球運動為例,棒球運動涉及多個核心項目和比賽形式,以下為主要分類: 一、比賽環節 投球(Pitching) 防守方投手向擊球員投球,目標是讓對方難以擊中或制造出局。 擊球(Batting) …

第五項修煉:打造學習型組織

最近一直接到的需求,都是公司董事長或總經理都特別推崇《第五項修煉:打造學習型組織》的內容,讓各個層級的管理者都持續學習、應用、實踐。我不禁開始反思,這背后到底隱藏著什么原因? 隨著商業環境的變化和復雜性的增加…

國內AWS CloudFront與S3私有桶集成指南:安全訪問靜態內容

在現代web應用架構中,將靜態內容存儲在Amazon S3中并通過CloudFront分發是一種常見且高效的做法。本指南將詳細介紹如何創建私有S3桶,配置CloudFront分配,并使用Origin Access Identity (OAI)來確保安全訪問。 步驟1:創建S3桶 首先,我們需要創建一個名為"b-static&…

BUUCTF——Nmap

BUUCTF——Nmap 進入靶場 類似于一個nmap的網站 嘗試一下功能 沒什么用 看看數據包 既然跟IP相關 偽造一個XXF看看 拼接了一下沒什么用 果然沒這么簡單 嘗試一下命令注入 構造payload 127.0.0.1 | ls 應該有過濾 加了個\ 直接構造個php木馬上傳試試 127.0.0.1 | <?…

NPN、PNP三極管的應用

由于電路知識實在是難以拿出手&#xff0c;在面試的時候被問到三極管相關問題&#xff0c;相當地尷尬。在網上簡要地學習了相關的理論知識&#xff0c;在這里給出自己的理解。更為基礎的原理在這里并不提及。我們面向實際應用學習即可。 我們知道常見的三極管總是硅管&#xff…

系統架構設計師案例分析題——軟件架構設計篇

重中之重&#xff0c;本題爭取拿下25滿分~ 目錄 一.核心知識 1.什么是架構風格 2.RUP的9個核心工作流 3.企業應用集成方式 4.軟件質量屬性 5.SySML系統建模語言9種圖 6.云計算架構 7.中間件 8.構件、連接件、軟件重用 9.層次型架構的缺點 10.架構開發方法ADM 11.微…

可變參數(Variadic Functions)- 《Go語言實戰指南》

Go 語言允許函數接受不定數量的參數&#xff0c;也稱“可變參數”。這為構建靈活的函數提供了便利&#xff0c;常用于求和、拼接等操作。 一、語法格式 func 函數名(參數名 ...類型) 返回值類型 {// 函數體 } 可變參數本質上是一個切片&#xff08;slice&#xff09;&#xf…

手機換IP真的有用嗎?可以干什么?

在當今數字化時代&#xff0c;網絡安全和個人隱私保護日益受到重視。手機作為我們日常生活中不可或缺的工具&#xff0c;其網絡活動痕跡往往通過IP地址被記錄和追蹤。那么&#xff0c;手機換IP真的有用嗎&#xff1f;它能為我們帶來哪些實際好處&#xff1f;本文將為你一一解答…

Linux517 rsync同步 rsync借xinetd托管 配置yum源回顧

計劃測試下定時服務 同步成功 是否為本地YUM源內容太少&#xff1f;考慮網絡YUM源 單詞拼錯了 計劃后面再看下 MX安裝 參考 計劃回顧配置YUM源 配置本地YUM源配置外網YUM源配置倉庫YUM源&#xff08;不熟&#xff09; 參考 參考阿里云 配置完畢 本地yum源配置 先備份 再…

第三部分:內容安全(第十六章:網絡型攻擊防范技術、第十七章:反病毒、第十八章:入侵檢測/防御系統(IDS/IPS))

文章目錄 第三部分&#xff1a;內容安全第十六章&#xff1a;網絡型攻擊防范技術網絡攻擊介紹流量型攻擊 --- Flood攻擊單包攻擊及防御原理掃描窺探攻擊畸形報文攻擊Smurf攻擊Land攻擊Fraggle攻擊IP欺騙攻擊 流量型攻擊防御原理DDoS通用攻擊防范技術 ---- 首包丟棄TCP類攻擊SYN…

c++成員函數返回類對象引用和直接返回類對象的區別

c成員函數返回類對象引用和直接返回類對象的區別 成員函數直接返回類對象&#xff08;返回臨時對象&#xff0c;對象拷貝&#xff09; #include <iostream> class MyInt { public:int value;//構造函數explicit MyInt(int v0) : value(v){}//加法操作,返回對象副本&…

阿里巴巴 1688 數據接口開發指南:構建自動化商品詳情采集系統

在電商行業數據驅動決策的趨勢下&#xff0c;高效獲取商品詳情數據成為企業洞察市場、優化運營的關鍵。通過阿里巴巴 1688 數據接口構建自動化商品詳情采集系統&#xff0c;能夠快速、精準地采集海量商品信息。本文將從開發準備、接口分析、代碼實現等方面&#xff0c;詳細介紹…

c語言 socket函數

c語言 socket函數 在 C 語言中,socket 函數是網絡編程的核心函數之一,用于創建一個網絡套接字(socket),它是網絡通信的端點。以下是關于 socket 函數的詳細介紹: 函數原型 #include <sys/socket.h>int socket(int domain, int type, int protocol);參數說明 domai…

Linux進程通訊和原子性

在Linux系統中&#xff0c;進程間通信&#xff08;IPC&#xff09;和原子性是并發編程中的核心問題。以下是對這些概念的詳細分步解釋&#xff1a; 一、進程間通信&#xff08;IPC&#xff09;方法 1. 管道&#xff08;Pipe&#xff09; 匿名管道&#xff1a;用于父子進程等有…

Java二叉樹題目練習

Java二叉題目練習 相同的樹對稱二叉樹平衡二叉樹二叉樹的最近公共祖先二叉樹的層序遍歷二叉樹層序遍歷 ||二叉樹遍歷 相同的樹 二叉樹的題目大多數時候就可以采用遞歸的方法寫 因為二叉樹是由根左子樹和右子樹組成&#xff0c;每一棵左子樹和右子樹又可以被看成一顆完整的樹&am…

【全網首發】解決coze工作流批量上傳excel數據文檔數據重復的問題

注意&#xff1a;目前方法將基于前一章批量數據庫導入的修改&#xff01;&#xff01;&#xff01;&#xff01;請先閱讀上篇文章的操作。抄襲注明來源 背景 上一節說的方法可以批量導入文件到數據庫&#xff0c;但是無法解決已經上傳的條目更新問題。簡單來說&#xff0c;不…

dockerdesktop 重新安裝

1、卸載 dockerdesktop 卸載時&#xff0c;最后一步刪除鏡像文件 會卡住 取消 2、在資源管理器中將鏡像文件路徑改名 如&#xff1a;e:\docker 修改 e:\docker1 3、重新安裝wsl wsl --shutdown 以管理員身份運行hy.bat pushd "%~dp0" dir /b %SystemRoot%\servic…

Linux docker常用命令

1、docker服務相關命令 啟動docker服務&#xff1a;systemctl start docker 停止docker服務&#xff1a;systemctl stop docker 重啟docker服務&#xff1a;systemctl restart docker 查看docker服務狀態&#xff1a;systemctl status docker 設置開機啟動docker服務&#xff1…

南京郵電大學金工實習答案

一、金工實習的定義 金工實習是機械類專業學生一項重要的實踐課程&#xff0c;它絕非僅僅只是理論知識在操作層面的簡單驗證&#xff0c;而是一個全方位培養學生綜合實踐能力與職業素養的系統工程。從本質上而言&#xff0c;金工實習是學生走出教室&#xff0c;親身踏入機械加…