Oracle Connect By верхняя / нижняя иерархия
Как я могу получить верх и низ иерархии, используя connect by, у меня есть таблица, в которой хранится переход между идентификаторами (ID-> REPLACE_ID), я заинтересован в получении последнего идентификатора, начиная с любого идентификатора.
--drop table test_connect_by;
create table test_connect_by(ID number, REPLACE_ID NUMBER);
insert into test_connect_by values(1,2);
insert into test_connect_by values(2,3);
insert into test_connect_by values(3,4);
insert into test_connect_by values(51,52);
insert into test_connect_by values(52,53);
insert into test_connect_by values(53,54);
insert into test_connect_by values(55,55);
SELECT id,replace_id, level
FROM test_connect_by
START WITH ID in (1,51)
CONNECT BY PRIOR replace_id = id;
Я заинтересован в получении переходов с 1-4 и 51-54, в качестве альтернативы я могу начать с 2 и получить 2-4. Могу ли я сгруппировать что-нибудь, чтобы определить группу, начинающуюся с 1, и группу, начинающуюся с 51?
2 ответа
В качестве одного (более простого) подхода вы можете просто найти самый низкий id
и самый высокий replace_id
группировка по connect_by_root()
значение, если replace_id
всегда гарантированно будет больше id
В противном случае смотрите ответ Леннарта:
select min(id) as begins
, max(replace_id) as ends
from test_connect_by
start with id in (1, 51)
connect by id = prior replace_id
group by connect_by_root(id)
Результат:
BEGINS ENDS
---------- ----------
1 4
51 54
Не проверено, поэтому там могут быть некоторые ошибки:
select id, replace_id
from (
SELECT CONNECT_BY_ROOT id as id, replace_id
, row_number() over (partition by CONNECT_BY_ROOT id order by level desc) as rn
FROM test_connect_by
START WITH ID in (1,51)
CONNECT BY PRIOR replace_id = id
) as T
where rn = 1