【问题标题】:PostgreSQL finding nearest parent value of a certain levelPostgreSQL查找某个级别的最近父值
【发布时间】:2020-12-21 18:26:43
【问题描述】:

*我很抱歉,当我写这个问题时,我的表格显示正确,并且在发布格式后看起来不正常。现在尝试解决这个问题
我正在尝试在 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 |

最好的方法是什么?

【问题讨论】:

    标签: sql postgresql common-table-expression hierarchical-data recursive-query


    【解决方案1】:

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

    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'
    

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

    【讨论】:

    • 当我这样做时,返回的行是我原始输出的第 4 行,其中列出的子 ID 是最近的伙伴。我想要的是让我的输出具有我插入到第一个 where 子句中的子 ID,然后是离该子最近的合作伙伴的 ID
    • @ekeckeisen:你已经知道id,因为这是查询的输入。如果你愿意,可以在查询的最后部分select它。
    • 是的,这是有道理的。但最终我可能想创建一个查询来拉出每个孩子和每个孩子最亲密的伙伴,在这种情况下,它不仅仅是我正在搜索的单个孩子 ID。这有意义吗?
    • @ekeckeisen。如果是这样,我们可以使用 CTE 中的另一列保留我们开始时的值。完成。
    猜你喜欢
    • 2013-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-07
    • 1970-01-01
    • 1970-01-01
    • 2018-07-31
    相关资源
    最近更新 更多