Oracle関数FIRST_VALUEは、次の2つの質問に基づいて使用する必要があると思います。SQL-
最大値の列を持つ行を選択する方法
Oracle:最大日付のレコードを取得する
組織に関連する人々を表す3つのテーブルがあります。各組織には親組織がある場合があります。ここで、ORG.PARENTはORG.IDへの外部キーです(したがって、テーブルはそれ自体を参照します)。1人が複数のグループに関連付けられている場合があります。
人
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が2回表示されることに注意してください。ただし、グループを2回表示したくありません。グループをツリーの最下位レベル、つまり最上位の値にのみ表示するようにします。運が悪かったのにFIRST_VALUEを使用してみた方法は次のとおりです。A-2(およびその他)が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の例に似ているように見えますが、パラメータをどのように調整しても機能しないようです。
特定のグループのレベル値が最も高い(つまり、ツリーの最下位)行のみを返すにはどうすればよいですか?