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,因此应该只有一个匹配项,或者根本没有匹配项。
*抱歉,当我写这个问题时我的表格显示正确并且在发布格式后看起来不正确。现在正在尝试解决这个问题
我正在尝试在 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,因此应该只有一个匹配项,或者根本没有匹配项。