gpt4 book ai didi

sql - 每个级别的 ltree child 的总和

转载 作者:行者123 更新时间:2023-11-29 13:00:49 24 4
gpt4 key购买 nike

我有一个包含 ltree 路径和名称列的 properties 表。 Ltree 路径包含父节点的 id,即“7968.7969.7987.8000”。每个树节点都有带有一些数值的报告。我需要找到 ltree 中每个节点的子节点值的总和。圆括号中的路径

        (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 索引。

关于sql - 每个级别的 ltree child 的总和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30569780/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com