首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >每个级别的ltree子值之和

每个级别的ltree子值之和
EN

Stack Overflow用户
提问于 2015-06-01 09:18:01
回答 1查看 625关注 0票数 2

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

代码语言:javascript
复制
        (1) A 
          |
     __________________________________
     |                |                |
(1.2)B            (1.3)C            (1.4)D
|
|________________________
        |                |
(1.2.5) E         (1.2.6) F

报告

代码语言:javascript
复制
property_id | value
    1       |   1 
    2       |   4
    3       |   19
    4       |   21
    5       |   9
    6       |   11

我需要找到像

代码语言:javascript
复制
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)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-06-01 11:27:28

给你:

代码语言:javascript
复制
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运算符有一些了解(%是通配符):

代码语言:javascript
复制
select 'prefix1' like 'prefix1%'; --true
select 'prefix1.something' like 'prefix1%'; --true
select 'prefix2' like 'prefix1%'; --false
select 'prefix2.something' like 'prefix1%'; --false

最后一步是将每个子节点的值连接起来,并将其加起来并按第一列分组。

编辑:

我受过一点教育,找到了更好的解决办法:

代码语言:javascript
复制
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索引,所以它更好。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30569780

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档