I desire to create an automatically numbered outline based on a CONNECT BY query result.
IF my query results are as follows:
level col1
----- --------
1 text1
1 text2
2 text3
3 text4
3 text5
1 text6
I am interested in deriving the numeric hierarchy values like so:
level outline col1
----- ------- --------
1 1 text1
1 2 text2
2 2.1 text3
3 2.1.1 text4
3 2.1.2 text5
1 3 text6
it feels like a sys_connect_by_path
or windowed lag
- but I'm not seeing it...
CodePudding user response:
You didn't provide test data, so I will illustrate on the scott.emp
table instead.
select level,
substr(sys_connect_by_path(rn, '.'), 2) as outline,
empno
from (
select empno, mgr,
row_number() over (partition by mgr order by empno) as rn
from scott.emp
)
start with mgr is null
connect by mgr = prior empno
order siblings by empno
;
LEVEL OUTLINE EMPNO
----- -------------- -----
1 1 7839
2 1.1 7566
3 1.1.1 7788
4 1.1.1.1 7876
3 1.1.2 7902
4 1.1.2.1 7369
2 1.2 7698
3 1.2.1 7499
3 1.2.2 7521
3 1.2.3 7654
3 1.2.4 7844
3 1.2.5 7900
2 1.3 7782
3 1.3.1 7934
In the subquery, we give a sequential number to "siblings" (rows/employees that have the same direct parent), and we use that in sys_connect_by_path
. To get the "right" ordering from the hierarchical query, you need to order siblings the same way you ordered them in the subquery (in my case, by empno
, which is primary key; in your case, if col1
may have duplicates, order by col1, rowid
in both places to break ties).