首页 > 解决方案 > PostgreSQL查找某个级别的最近父值

问题描述

*我很抱歉,当我写这个问题时,我的表格显示正确,并且在发布格式后看起来不对。试图解决这个问题现在
我正在尝试在 postgresql 中编写一个查询,对于任何给定的子值,该查询将返回已达到某个等级的最近的父值。目前,我有这个查询,它显示任何给定子值的整个层次路径-

WITH RECURSIVE tree AS ( 
   SELECT "ChildDisplayID", 
          "ParentID",
          "Rank",
          1 as level 
   FROM table1
   WHERE "ChildDisplayID" = {{some ChildID}}

   UNION ALL 

   SELECT t1."ChildDisplayID",
          t1."ParentID", 
          t1."Rank",
          t.level + 1
   FROM table1 t1
     JOIN tree t ON t."ParentID" = t1."ChildDisplayID"
)
SELECT *
FROM tree

我想要做的是在一行中显示最近的父级的子 ID 和父 ID,其等级为“合作伙伴”。例如,这是我目前得到的输出:

| ChildID | ParentID | Rank | Level |   
|---------|----------|------|-------|  
|   6     |     5    |Associate Manager| 1    |  
|   5     |     4    |Manager| 2    |  
|   4     |     3    |Associate Partner| 3    |  
|   3     |     2    |Partner| 4    |  
|   2     |     1    |Partner| 5    |  
|   1     |         |CEO| 6    |  

这是我想要的输出:

|ChildID | Nearest Partner | Rank |
|--------|----------|------|
|6       |3         | Partner |

做这个的最好方式是什么?

标签: sqlpostgresqlcommon-table-expressionhierarchical-datarecursive-query

解决方案


您可以在递归中对第一个匹配的伙伴设置停止条件,然后过滤结果:

WITH RECURSIVE tree AS ( 
   SELECT "ChildDisplayID" as initialid, "ChildDisplayID", "ParentID", "Rank", 1 as level 
   FROM table1
   WHERE "ChildDisplayID" = {{some ChildID}}
   UNION ALL 
   SELECT t.initialid, t1."ChildDisplayID", t1."ParentID", t1."Rank", t.level + 1
   FROM table1 t1
   INNER JOIN tree t ON t."ParentID" = t1."ChildDisplayID"
   WHERE t."Rank" <> 'Partner'
)
SELECT *
FROM tree
WHERE "Rank" = 'Partner'

看起来你有一个层次结构,每个孩子只有一个父母,所以应该只有一个匹配,或者根本没有匹配。


推荐阅读