从层次结构路径计数 children

Count children from hierarchy path

我有一个 table 这样的:

id name path
1 John /1
2 Mark /2
3 Kevin /1/3
4 Sarah /1/3/4
5 Andy /2/5
... ... ...

所以,我可以说 Sarah 是 Kevin 的 child,也就是 John 的 child。

我想要这个:

id name path number of children
1 John /1 2
2 Mark /2 1
3 Kevin /1/3 1
4 Sarah /1/3/4 0
5 Andy /2/5 0
... ... ... ...

任务编号 2: 假设我也有这个table

id income user_id
1 200 1
2 120 1
3 340 2
4 500 3
5 600 5
6 80 5

我可以说约翰的总收入是320$,但是如果我还要算约翰的children,那就是820$(因为id=3是约翰的child) .所以,我也想要一个可以计算所有等级收入的查询。

你可以这样做:

select
  t.*,
  (select count(*) from t c where c.path like t.path || '/%') as c_count,
  i.income + (
    select coalesce(sum(i.income), 0) from t c join i on i.user_id = c.id
     where c.path like t.path || '/%'
  ) as c_income
from t
left join (
  select user_id, sum(income) as income from i group by user_id
) i on i.user_id = t.id

结果:

 id  name   path    c_count  c_income 
 --- ------ ------- -------- -------- 
 1   John   /1      2        820      
 2   Mark   /2      1        1020     
 3   Kevin  /1/3    1        500      
 4   Sarah  /1/3/4  0        null     
 5   Andy   /2/5    0        680      

参见 DB Fiddle 中的示例。