【问题标题】:How to list out management levels from Postgres table如何从 Postgres 表中列出管理级别
【发布时间】:2020-09-25 03:35:21
【问题描述】:

我有一个包含以下字段的表格: Id、manager_id 和 Candidate_name

manager_id 将指向允许我引用管理链的 id。我想生成如下输出:

标识 |候选人姓名 | manager_id | lvl1 管理员ID | lvl1 经理候选人姓名 | lvl2 管理员ID | lvl2 经理候选人姓名 |等等……

我最终想构建一个这种结构的 csv,以便我可以在报告中利用它。

到目前为止,我已经使用以下查询来接近这一点:

CREATE EXTENSION tablefunc;

SELECT * FROM connectby('job', 'id', 'manager_id', '261', 0, ',') AS t(id int, manager_id int, level int, ord text) order by id;

输出如下:

  id   | manager_id | level |                       ord                        
-------+------------+-------+--------------------------------------------------
     2 |         12 |     3 | 261,226,12,2
     3 |          2 |     4 | 261,226,12,2,3
     4 |        106 |     4 | 261,226,110,106,4
     5 |          4 |     5 | 261,226,110,106,4,5
     6 |         86 |     4 | 261,226,12,86,6
     7 |        920 |     6 | 261,226,12,86,6,920,7
     8 |         86 |     4 | 261,226,12,86,8
     9 |          8 |     5 | 261,226,12,86,8,9
    10 |        145 |     5 | 261,226,12,4209,145,10
    11 |        139 |     7 | 261,226,12,4209,145,10,139,11
    12 |        226 |     2 | 261,226,12
    13 |       4209 |     4 | 261,226,12,4209,13
    14 |        159 |     5 | 261,226,12,69,159,14
    15 |         14 |     6 | 261,226,12,69,159,14,15
    16 |        110 |     3 | 261,226,110,16

ord 列为我提供了管理链,但我在如何生成具有我正在寻找的经理级别的列方面遇到了困难。这也不必只存在于 SQL 中。

请注意,就深度而言,管理层可以进入十几岁。欣赏有关如何处理此问题的任何想法。

【问题讨论】:

    标签: sql database postgresql select recursive-query


    【解决方案1】:

    如果您事先知道层次结构中的最大级别数(例如 3),则一种选择使用递归查询和条件聚合:

    with recursive cte as (
        select id employee_id, id, manager_id, candidate_name, 0 lvl from mytable
        union all
        select c.employee_id, t.id, t.manager_id, t.candidate_name, lvl + 1
        from cte c
        inner join mytable t on t.id = c.manager_id
    )
    select 
        employee_id,
        max(case when lvl = 1 then id             end) level1_manager_id,
        max(case when lvl = 1 then candidate_name end) level1_candidate_name,
        max(case when lvl = 2 then id             end) level2_manager_id,
        max(case when lvl = 2 then candidate_name end) level2_candidate_name
        max(case when lvl = 2 then id             end) level3_manager_id,
        max(case when lvl = 2 then candidate_name end) level3_candidate_name
    from cte
    group by employee_id
    

    您可以使用更多列扩展where 子句以处理其他级别。当给定员工的层次结构耗尽时,更多列显示null 值。

    另一方面,如果要根据层次结构中的员工深度动态创建列,则需要动态SQL,这要复杂得多。

    【讨论】:

    • 在第 4 个最大行的末尾缺少一个 ,。还需要在最后 2 个最大行上将 lvl =2 更改为 3,否则这可行。谢谢
    • 对此进行再跟进。我希望 0 级总是从特定的经理开始,然后从那里向下扩展。示例 Jill Smith 是 CEO,希望她对所有用户都是 0 级,并让候选人和 Jill Smith 之间的管理链填写这些级别。关于如何实现这一点的任何想法。在我上面的示例中,它使用 261 作为第一级。
    猜你喜欢
    • 2013-06-14
    • 1970-01-01
    • 2011-06-04
    • 2014-05-16
    • 1970-01-01
    • 2017-02-16
    • 2023-01-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多