PostgreSQL 查找某个级别的最近 parent 值

PostgreSQL finding nearest parent value of a certain level

*抱歉,当我写这个问题时我的表格显示正确并且在发布格式后看起来不正确。现在正在尝试解决这个问题
我正在尝试在 postgresql 中编写一个查询,该查询将 return,对于任何给定的 child 值,最近的 parent 值已达到特定等级。目前,我有这个查询,它显示了任何给定 child 值-

的整个层次结构路径
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

我想要做的是在一行中显示 child ID 和最近的 parent 的 parent 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 |

最好的方法是什么?

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

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'

您的层次结构似乎每个 child 只有一个 parent,因此应该只有一个匹配项,或者根本没有匹配项。