postgres hierarchy - 用祖先的值填充缺失值

问题描述 投票:0回答:1

我有一个包含层次结构 (ltree) 的 postgres 表:

| hierarchy |
|-----------|
| A         |
| A.X       |
| A.X.Y.    |
| A.X.Y.Z   |
| A.B       |
| A.B.C     |
| A.B.C.D   |
| A.B.C.D.E |

和结果表:

| marker | tier | hierarchy |
|:------:|:----:|:---------:|
|    1   |   1  |     A     |
|    1   | NULL |   A.X.Y   |
|    1   |   2  |    A.X    |
|    1   | NULL | A.B.C.D.E |
|    1   |   4  |   A.B.C   |
|    1   | NULL |     A     |
|    2   | NULL |    A.B    |
|    2   | NULL |   A.B.C   |

我想创建一个视图,将层列中的 NULL 值替换为最近的非 NULL 祖先层(即父层 - 如果父层为空,查看祖父母的层等,一直回到根如有必要)用于相关标记。

此示例的输出视图如下所示:

| marker | tier | hierarchy |
|:------:|:----:|:---------:|
|    1   |   1  |     A     |
|    1   |   2  |   A.X.Y   |
|    1   |   2  |    A.X    |
|    1   |   4  | A.B.C.D.E |
|    1   |   4  |    A.B    |
|    1   |   1  |     A     |
|    2   | NULL |    A.B    |
|    2   | NULL |   A.B.C   |

你能帮忙吗?

postgresql hierarchy ltree
1个回答
0
投票

这可能看起来像是自我的工作

LEFT JOIN
,但连接条件并不是那么明确——它实际上需要从多个可能的祖先中选择“最接近的”。用子查询更容易表达:

CREATE VIEW nice_results AS
SELECT
  marker,
  COALESCE(tier, (
    SELECT tier
    FROM results AS ancestor
    WHERE ancestor.marker = node.marker
      AND ancestor.tier IS NOT NULL
      AND ancestor.hierarchy @> node.hiearchy
    ORDER BY nlevel(ancestor.hiearchy) DESC
    LIMIT 1
  )) AS tier,
  hierarchy
FROM results AS node
© www.soinside.com 2019 - 2024. All rights reserved.