SELECT rep.*,
rank() OVER (PARTITION BY rep.ASSEMBLY_ID
ORDER BY CASE WHEN rep.state_code = 'PUBLISH' THEN 1 ELSE 2 END) rnk
FROM
(SELECT *
FROM TABLE T
START WITH T.SCENARIO_ID = <SCENARIO_ID>
CONNECT BY PRIOR T.COMPONENT_ID = T.ASSEMBLY_ID
)rep WHERE rep.rnk = 1
上面的查询构建了项目结构的层次结构,其中组件 A 的组件是其他组件的父组件。在该层次结构中,我只想选择那些根据“STATE_CODE”排名为 1 的程序集,对于层次结构中的父节点,该程序集可以是“PUBLISH”或“ROLLUP”。我可以使用 RANK 函数实现它,但无法限制 RANK 为 1 以外的程序集的子行。有关如何通过在 CONNECT BY OPERATOR 中引入排名函数来限制子行的任何输入,请进行查询仅当程序集排名为 1 时才执行 CONNECT BY 操作
使用 CTE 计算排名,并在
rnk = 1
和 START WITH
子句中包含 CONNECT BY
条件。
WITH ranked_T AS (
SELECT T.*,
RANK() OVER (PARTITION BY T.ASSEMBLY_ID
ORDER BY CASE WHEN T.STATE_CODE = 'PUBLISH' THEN 1 ELSE 2 END) AS rnk
FROM T
)
SELECT *
FROM ranked_T
START WITH ranked_T.SCENARIO_ID = <SCENARIO_ID> AND ranked_T.rnk = 1
CONNECT BY PRIOR ranked_T.COMPONENT_ID = ranked_T.ASSEMBLY_ID
AND ranked_T.rnk = 1;