Я считаю, что функция Oracle FIRST_VALUE - это то, что мне нужно использовать, основываясь на этих двух вопросах:
SQL - Как выбрать строку, имеющую столбец с максимальным значением
Oracle: получение записи с максимальной датой
У меня есть 3 таблицы, которые представляют людей, связанных с организациями. У каждой организации может быть родительский орган, где ORG.PARENT является внешним ключом для ORG.ID (поэтому таблица ссылается на себя). Человек может быть связан с более чем одной группой.
PERSON
ID NAME
----------
1 Bob
ORG
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);
Это похоже на пример FIRST_VALUE в Pro Oracle SQL, но я не могу заставить его работать независимо от того, как я настраиваю параметры.
Как я могу вернуть только те строки, в которых данная группа имеет самое высокое значение уровня (т. Е. Самое дальнее в дереве)?