【问题标题】:How to get top dept_id of every row如何获取每一行的 top dept_id
【发布时间】:2020-12-19 04:37:39
【问题描述】:

问题:如何获取每一行的 top dept_id。

输入数据

+---------+------------+----------+
| Dept_ID | PR_Dept_ID | DeptName |
+---------+------------+----------+
|    0000 | null       | HR00     |
|    0001 | 0000       | HR01     |
|    0002 | 0000       | HR02     |
|    0003 | 0002       | HR03     |
|    0004 | 0002       | HR04     |
|    0005 | 0004       | HR05     |
|    0006 | null       | INV00    |
|    0007 | 0006       | INV01    |
|    0008 | 0007       | INV02    |
+---------+------------+----------+

树级

HR00
    HR01
    HR02
        HR03
        HR04
            HR05
INV00
    INV01
        INV02

预期结果:

+---------+------------+----------+-------------+
| Dept_ID | PR_Dept_ID | DeptName | top_Dept_ID |
+---------+------------+----------+-------------+
|    0000 | null       | HR00     | null        |
|    0001 | 0000       | HR01     | 0000        |
|    0002 | 0000       | HR02     | 0000        |
|    0003 | 0002       | HR03     | 0000        |
|    0004 | 0002       | HR04     | 0000        |
|    0005 | 0004       | HR05     | 0000        |
|    0006 | null       | INV00    | null        |
|    0007 | 0006       | INV01    | 0006        |
|    0008 | 0007       | INV02    | 0006        |
+---------+------------+----------+-------------+

我尝试过并遇到的问题:

如果行数据的级别没有改变,那么我可以使用join * level count 来解决问题。但现在是dynamic level,例如HR等级4,INV等级3,我这里有问题。

如果有人能给我一个关键字或逻辑,我将不胜感激。

在线测试链接:SQL Server 2017 | db<>fiddle

【问题讨论】:

标签: sql sql-server


【解决方案1】:

按照 Dale K & Basin 关键字 CTE Recursion to get tree hierarchy,我明白了这一点并针对此案例做了一些修复。

;with cte as (
    select *, cast(dept_id as varchar(255)) top_dept_id
    from dep
    where pr_dept_id is null
    union all
    select t1.*, t2.top_dept_id 
    from dep t1
    inner join cte t2 on t2.dept_id = t1.pr_dept_id 
)
select  
    dept_id, pr_dept_id, deptname
    , case when top_dept_id = cast(dept_id as varchar(255)) then null else top_dept_id end as top_dept_id
from cte
order by dept_id

SQL Server 2017 | db<>fiddle

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-26
    • 2022-06-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多