每层 ltree children 的总和
sum of ltree children per level
我有一个带有 ltree 路径和名称列的 properties
table。 Ltree 路径包含 parent 个节点的 ID,即“7968.7969.7987.8000”。每个树节点都有 reports
和一些数值。我需要为 ltree 中的每个节点找到 children 个节点值的总和。圆括号中的路径
(1) A
|
__________________________________
| | |
(1.2)B (1.3)C (1.4)D
|
|________________________
| |
(1.2.5) E (1.2.6) F
报告
property_id | value
1 | 1
2 | 4
3 | 19
4 | 21
5 | 9
6 | 11
我需要找到像
这样的东西
full_path | subtree_sum
A | 60 (1 + 4 + 19 + 21 + 9 + 11)
A.B | 24 (4 + 9 + 11)
A.C | 19 (19)
A.D | 21 (21)
A.B.E | 9 (9)
A.B.F | 11 (11)
你在这里:
select
p.path,
sum(r.value)
from properties p
left join properties sub on sub.path::text like p.path::text||'%'
left join reports r on r.property_id=sub.id
group by 1;
它是如何工作的?
对于在我们的查询 p
中调用的每个节点,我们通过加入 sub
来检索它的所有子节点(包括它自己)。要加入,我们使用 like
运算符,它允许我们使用 p
路径作为前缀。应该让您对 like
运算符(%
是通配符)有一些了解的快速示例:
select 'prefix1' like 'prefix1%'; --true
select 'prefix1.something' like 'prefix1%'; --true
select 'prefix2' like 'prefix1%'; --false
select 'prefix2.something' like 'prefix1%'; --false
最后一步是加入每个子节点的值,将其相加并按第一列分组。
编辑:
我自学了一下,找到了更好的解决方案:
select
p.path,
sum(r.value)
from properties p
left join properties sub on sub.path <@ p.path
left join reports r on r.property_id=sub.id
group by 1;
更好,因为 <@
运算符利用现有的 GiST 索引。
我有一个带有 ltree 路径和名称列的 properties
table。 Ltree 路径包含 parent 个节点的 ID,即“7968.7969.7987.8000”。每个树节点都有 reports
和一些数值。我需要为 ltree 中的每个节点找到 children 个节点值的总和。圆括号中的路径
(1) A
|
__________________________________
| | |
(1.2)B (1.3)C (1.4)D
|
|________________________
| |
(1.2.5) E (1.2.6) F
报告
property_id | value
1 | 1
2 | 4
3 | 19
4 | 21
5 | 9
6 | 11
我需要找到像
这样的东西full_path | subtree_sum
A | 60 (1 + 4 + 19 + 21 + 9 + 11)
A.B | 24 (4 + 9 + 11)
A.C | 19 (19)
A.D | 21 (21)
A.B.E | 9 (9)
A.B.F | 11 (11)
你在这里:
select
p.path,
sum(r.value)
from properties p
left join properties sub on sub.path::text like p.path::text||'%'
left join reports r on r.property_id=sub.id
group by 1;
它是如何工作的?
对于在我们的查询 p
中调用的每个节点,我们通过加入 sub
来检索它的所有子节点(包括它自己)。要加入,我们使用 like
运算符,它允许我们使用 p
路径作为前缀。应该让您对 like
运算符(%
是通配符)有一些了解的快速示例:
select 'prefix1' like 'prefix1%'; --true
select 'prefix1.something' like 'prefix1%'; --true
select 'prefix2' like 'prefix1%'; --false
select 'prefix2.something' like 'prefix1%'; --false
最后一步是加入每个子节点的值,将其相加并按第一列分组。
编辑:
我自学了一下,找到了更好的解决方案:
select
p.path,
sum(r.value)
from properties p
left join properties sub on sub.path <@ p.path
left join reports r on r.property_id=sub.id
group by 1;
更好,因为 <@
运算符利用现有的 GiST 索引。