使用递归 cte 将数组中的父 id 和所有子 id 组合在一行中

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

我有一个包含两列的表格:

stg source id, parent id

125, 124
126, 125
127, 125
128, 127 

我想要的最终结果是:

parent id, stg_source_ids
124, [125, 126, 127, 128] 

作为另一个视图中我的最后一行。

我正在尝试使用递归 cte 来解决这个问题

WITH RECURSIVE ParentChildHierarchy AS (
    SELECT pr.parent_id, pr.stg_source_id, 
    ARRAY_CONSTRUCT(pr.stg_source_id) AS stg_source_ids
    FROM pr
    WHERE NOT EXISTS (SELECT 1 FROM pr as pr2 WHERE 
    pr2.stg_source_id = pr.parent_id)

UNION ALL

SELECT pr.parent_id, pr.stg_source_id, 
array_append(p.stg_source_ids, pr.stg_source_id)
FROM pr JOIN ParentChildHierarchy p 
ON pr.parent_id = p.stg_source_id

这个产品 结果如:

124 -- [125]
125 -- [125, 126]
125 -- [125, 127]
127 -- [127, 128]
snowflake-cloud-data-platform common-table-expression recursive-query
1个回答
0
投票

您可以尝试Snowflake中的listagg函数,

WITH CTE as (
SELECT pr.parent_id, pr.stg_source_id
    FROM pr
    WHERE NOT EXISTS (SELECT 1 FROM pr as pr2 WHERE 
    pr2.stg_source_id = pr.parent_id)
  union all 
  Select a.parent_id, b.stg_source_id
  from CTE a inner join pr b on a.stg_source_id=b.parent_id
)Select parent_id, LISTAGG(stg_source_id, ',') WITHIN GROUP(ORDER BY stg_source_id) AS child
from CTE;

它将 stg_source_id 聚合到一个数组中

© www.soinside.com 2019 - 2024. All rights reserved.