pathTable2 timeTable2
DAY AMPM SEQ NO Code name Code1 Code2 time
-------- ---- --- -- ---- ---- ----- ----- ----
20071001 1 1 1 A A A B 10
20071001 1 2 2 B B B C 20
20071001 1 3 3 C C B D 30
20071001 1 4 3 D D C E 40
20071001 1 5 4 E E D E 50
20071001 1 6 5 F F E F 60
20071001 1 7 5 G G E G 70
20071001 1 8 6 H H F H 80
20071001 1 9 6 I I F I 90
20071001 1 10 7 J J G H 100
20071001 2 1 1 A A G I 110
20071001 2 2 2 B B H J 120
20071001 2 3 3 C C I J 130
20071001 2 4 3 D D J A 140
20071001 2 5 4 E E
20071001 2 6 5 F F
20071001 2 7 5 G G
20071001 2 8 6 H H
20071001 2 9 6 I I
20071001 2 10 7 J J
20071002 1 1 1 A A
20071002 1 2 2 B B
20071002 1 3 3 C C
20071002 1 4 3 D D
20071002 1 5 4 K K
20071002 1 6 5 F F
20071002 1 7 5 G G
20071002 1 8 6 H H
20071002 1 9 6 I I
20071002 1 10 7 J J
10-192 高さが1小さい要素の数を求めるその1
のアレンジ問題です。
変更点は、以下の2点です。
timeTable2からtimeを取得できない場合は、0として扱う。
order by DAY,AMPM,NO
の順序で階層展開する。(下の図のイメージ)
DAY |AMPM|NO| name
---------|----|--|--------
20071001 | 1 |1| A
| | | |
20070101 | 1 |2| B
| | | / \
20070101 | 1 |3| C D
| | | \ /
20070101 | 1 |4| E
| | | / \
20070101 | 1 |5| F G
| | | |
20070101 | 1 |6| H I
| | | \ /
20070101 | 1 |7| J
| | | |
20071001 | 2 |1| A
| | | |
20070101 | 2 |2| B
| | | / \
20070101 | 2 |3| C D
| | | \ /
20070101 | 2 |4| E
| | | / \
20070101 | 2 |5| F G
| | | |
20070101 | 2 |6| H I
| | | \ /
20070101 | 2 |7| J
| | | |
20071002 | 1 |1| A
| | | |
20070102 | 1 |2| B
| | | / \
20070102 | 1 |3| C D
| | | \ /
20070102 | 1 |4| K
| | | / \
20070102 | 1 |5| F G
| | | |
20070102 | 1 |6| H I
| | | \ /
20070102 | 1 |7| J
出力結果
DAY AMPM SEQ NO Code name time
-------- ---- --- -- ---- ---- ----
07-10-01 1 1 1 A A 0
07-10-01 1 2 2 B B 10
07-10-01 1 3 3 C C 20
07-10-01 1 4 3 D D 30
07-10-01 1 5 4 E E 90
07-10-01 1 6 5 F F 60
07-10-01 1 7 5 G G 70
07-10-01 1 8 6 H H 100
07-10-01 1 9 6 I I 110
07-10-01 1 10 7 J J 250
07-10-01 2 1 1 A A 140
07-10-01 2 2 2 B B 10
07-10-01 2 3 3 C C 20
07-10-01 2 4 3 D D 30
07-10-01 2 5 4 E E 90
07-10-01 2 6 5 F F 60
07-10-01 2 7 5 G G 70
07-10-01 2 8 6 H H 100
07-10-01 2 9 6 I I 110
07-10-01 2 10 7 J J 250
07-10-02 1 1 1 A A 140
07-10-02 1 2 2 B B 10
07-10-02 1 3 3 C C 20
07-10-02 1 4 3 D D 30
07-10-02 1 5 4 K K 0
07-10-02 1 6 5 F F 0
07-10-02 1 7 5 G G 0
07-10-02 1 8 6 H H 100
07-10-02 1 9 6 I I 110
07-10-02 1 10 7 J J 250
create table pathTable2(
DAY DATE not null,
AMPM number(1) not null, -- 1=AM,2=PM
SEQ number(2) not null,
NO number(2) not null,
Code char(1) not null,
name char(2) not null,
primary key(DAY,AMPM,SEQ));
create table timeTable2(
Code1 char(1) not null,
Code2 char(1) not null,
time number(3) not null,
primary key(Code1,Code2));
insert all
into pathTable2 values(to_date('20071001','yyyymmdd'),1, 1,1,'A','A')
into pathTable2 values(to_date('20071001','yyyymmdd'),1, 2,2,'B','B')
into pathTable2 values(to_date('20071001','yyyymmdd'),1, 3,3,'C','C')
into pathTable2 values(to_date('20071001','yyyymmdd'),1, 4,3,'D','D')
into pathTable2 values(to_date('20071001','yyyymmdd'),1, 5,4,'E','E')
into pathTable2 values(to_date('20071001','yyyymmdd'),1, 6,5,'F','F')
into pathTable2 values(to_date('20071001','yyyymmdd'),1, 7,5,'G','G')
into pathTable2 values(to_date('20071001','yyyymmdd'),1, 8,6,'H','H')
into pathTable2 values(to_date('20071001','yyyymmdd'),1, 9,6,'I','I')
into pathTable2 values(to_date('20071001','yyyymmdd'),1,10,7,'J','J')
into pathTable2 values(to_date('20071001','yyyymmdd'),2, 1,1,'A','A')
into pathTable2 values(to_date('20071001','yyyymmdd'),2, 2,2,'B','B')
into pathTable2 values(to_date('20071001','yyyymmdd'),2, 3,3,'C','C')
into pathTable2 values(to_date('20071001','yyyymmdd'),2, 4,3,'D','D')
into pathTable2 values(to_date('20071001','yyyymmdd'),2, 5,4,'E','E')
into pathTable2 values(to_date('20071001','yyyymmdd'),2, 6,5,'F','F')
into pathTable2 values(to_date('20071001','yyyymmdd'),2, 7,5,'G','G')
into pathTable2 values(to_date('20071001','yyyymmdd'),2, 8,6,'H','H')
into pathTable2 values(to_date('20071001','yyyymmdd'),2, 9,6,'I','I')
into pathTable2 values(to_date('20071001','yyyymmdd'),2,10,7,'J','J')
into pathTable2 values(to_date('20071002','yyyymmdd'),1, 1,1,'A','A')
into pathTable2 values(to_date('20071002','yyyymmdd'),1, 2,2,'B','B')
into pathTable2 values(to_date('20071002','yyyymmdd'),1, 3,3,'C','C')
into pathTable2 values(to_date('20071002','yyyymmdd'),1, 4,3,'D','D')
into pathTable2 values(to_date('20071002','yyyymmdd'),1, 5,4,'K','K')
into pathTable2 values(to_date('20071002','yyyymmdd'),1, 6,5,'F','F')
into pathTable2 values(to_date('20071002','yyyymmdd'),1, 7,5,'G','G')
into pathTable2 values(to_date('20071002','yyyymmdd'),1, 8,6,'H','H')
into pathTable2 values(to_date('20071002','yyyymmdd'),1, 9,6,'I','I')
into pathTable2 values(to_date('20071002','yyyymmdd'),1,10,7,'J','J')
into timeTable2 values('A','B', 10)
into timeTable2 values('B','C', 20)
into timeTable2 values('B','D', 30)
into timeTable2 values('C','E', 40)
into timeTable2 values('D','E', 50)
into timeTable2 values('E','F', 60)
into timeTable2 values('E','G', 70)
into timeTable2 values('F','H', 80)
into timeTable2 values('F','I', 90)
into timeTable2 values('G','H',100)
into timeTable2 values('G','I',110)
into timeTable2 values('H','J',120)
into timeTable2 values('I','J',130)
into timeTable2 values('J','A',140)
select 1 from dual;
commit;
select distinct DAY,AMPM,SEQ,NO,Code,name,
case when LV = 1
then 0
when PreLVCount =1 and LVCount =1
then time
when PreLVCount =1 and LVCount >1
then time
when PreLVCount >1 and LVCount =1
then sum(time) over(partition by Row_ID)
when PreLVCount >1 and LVCount >1
then max(time) over(partition by Row_ID) end as time
from (select DAY,AMPM,SEQ,NO,Code,name,LV,LVCount,Row_ID,
max(LVCount)
over(order by LV range between 1 preceding
and 1 preceding) as PreLVCount,
nvl((select b.time
from timeTable2 b
where b.Code1 = a.PreCode
and b.Code2 = a.Code),0) as time
from (select DAY,AMPM,SEQ,NO,Code,name,LV,PreCode,Row_ID,
count(distinct Row_ID) over(partition by LV) as LVCount
from (select distinct DAY,AMPM,SEQ,NO,Code,name,Level as LV,
prior Code as PreCode,RowID as Row_ID
from (select DAY,AMPM,SEQ,NO,Code,name,
dense_Rank() over(order by DAY,AMPM,NO) as Rank
from pathTable2)
Start With Rank = 1
connect by prior Rank+1 = Rank)) a)
order by DAY,AMPM,SEQ;
最初に、dense_Rank関数で木の高さを求めてます。 脳内で木をイメージするには、 情報処理技術者試験の木の問題に慣れるのが早いと思います。 階層問い合わせと、木構造