従業員 DB から組織ツリーを抽出する SQL

 
Snowflake に格納されてる従業員テーブルから組織ツリーを抽出するクエリを書いたのでメモ

with recursive mgmt(delim, user_id, manager_id, job_title, emp_hier_level) as (
    select 
        ' ' as delim
        ,user_id
        ,manager_id
        ,job_title
        ,1 as emp_hier_level
    from dim_employee
    where job_title = 'CEO'
    union all
    select 
        (delim || '-> ')
        ,e.user_id
        ,e.manager_id
        ,e.job_title
        ,emp_hier_level + 1
    from dim_employee as e
    join mgmt as m
    on e.manager_id = m.user_id
)
, b as (select 
    delim || job_title as emp_hier
    ,user_id
    ,manager_id
    ,job_title
    ,emp_hier_level
from mgmt)
select distinct * from b;

dim_employee (従業員テーブル) に user_id (従業員ID) と job_title (肩書) と manager_id が入っている。
そこから recursive CTE でループしながら社員ごとにCEOから自分までのノード(距離)を「 -> 」区切りで並べてぶら下げて行くという処理。

recursive やっぱ便利よ。