我相信 Oracle 函数 FIRST_VALUE 是我需要基于以下两个问题使用的:
SQL - 如何选择具有最大值
Oracle 列的行:以最大日期记录
我有 3 个表代表与组织相关的人员。每个组织可能有一个父组织,其中 ORG.PARENT 是 ORG.ID 的外键(因此该表引用自身)。一个人可能与多个组相关联。
人
ID NAME
----------
1 Bob
组织机构
ID NAME PARENT
------------------------
1 A (null)
2 A-1 1
3 A-2 1
4 A-3 1
5 A-1-a 2
6 A-1-b 2
7 A-2-a 3
8 A-2-b 3
PERSON_TO_ORG
PERSON_ID ORG_ID
-----------------
1 1
1 3
我想列出一个人与之关联的组,所以我使用了这个查询:
SELECT NAME, ID, sys_connect_by_path(NAME, '/') AS path
FROM org
START WITH ID IN
(SELECT org_id FROM person_to_org WHERE person_id=1)
connect by prior org.ID = org.parent;
...这给了我:
NAME ID PATH
------------------
A-2 3 /A-2
A-2-a 8 /A-2/A-2-a
A-2-b 9 /A-2/A-2-b
A 1 /A
A-1 2 /A/A-1
A-1-a 5 /A/A-1/A-1-a
A-1-b 6 /A/A-1/A-1-b
A-2 3 /A/A-2
A-2-a 8 /A/A-2/A-2-a
A-2-b 9 /A/A-2/A-2-b
A-3 4 /A/A-3
请注意 A-2 是如何出现两次的,因为它应该出现。但是,我不希望一个组出现两次。我希望一个组只出现在树中的最低级别,即最高级别的值。以下是我尝试使用 FIRST_VALUE 时没有运气的方法 - 我仍然让 A-2(和其他人)出现两次:
SELECT id, name, path, first_value(lev) OVER
(
PARTITION BY ID,NAME, path ORDER BY lev DESC
) AS max_lev FROM
(SELECT NAME, ID, sys_connect_by_path(NAME, '/') AS path, LEVEL as lev
FROM org START WITH ID IN
(SELECT org_id FROM person_to_org WHERE person_id=1)
connect by prior org.ID = org.parent);
这似乎类似于 Pro Oracle SQL 中的 FIRST_VALUE 示例,但无论我如何调整参数,我似乎都无法使其工作。
如何仅返回给定组具有最高级别值的行(即树中最下方)?