sql - 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 |
做这个的最好方式是什么?
解决方案
您可以在递归中对第一个匹配的伙伴设置停止条件,然后过滤结果:
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'
看起来你有一个层次结构,每个孩子只有一个父母,所以应该只有一个匹配,或者根本没有匹配。
推荐阅读
- angular - 如何将 HTTP/2 用于 manifest.json?
- vagrant - vagrant 命令 - vagrant init 与 add
- android - 错误代码 9003,“places_api_access_not_configured”使用 google place api 和 android
- python - 有没有办法可以替换/删除字符串中除某些短语之外的所有内容?
- vue.js - 如何根据条件显示选择?(元素-ui表)
- drupal-8 - 使用暴露过滤器时如何在 drupal 8 页面管理器中更改 URL
- ios - iOS中的颤振audio_service依赖问题
- swift - UILabel 上显示的纬度和经度
- android - 如何比较或验证不覆盖 equals 方法的对象?
- php - 有没有一种按数组顺序执行函数的方法