postgresql postgres hierarchy -用祖先的值填充缺少的值

kninwzqo  于 2023-04-29  发布在  PostgreSQL
关注(0)|答案(1)|浏览(168)

我有一个包含层次结构(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层(即。e.父层-如果父层为空,则查看祖父母的层等,如果必要的话,一直回到树的根)。
此示例的输出视图如下所示:

| 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   |

你能帮忙吗?

5q4ezhmt

5q4ezhmt1#

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

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.hierarchy
    ORDER BY nlevel(ancestor.hierarchy) DESC
    LIMIT 1
  )) AS tier,
  hierarchy
FROM results AS node

相关问题