TaskListテーブル
TaskID ExeName StartTime EndTime
------ -------- -------------- --------------
1 cmd 2007/1/4 07:00 2007/1/4 08:00
2 notepad 2007/1/4 08:00 2007/1/4 11:00
3 exp 2007/1/4 08:00 2007/1/4 13:30
4 calc 2007/1/4 09:00 2007/1/4 13:00
5 excel 2007/1/4 09:00 2007/1/4 15:30
6 imp 2007/1/4 10:00 2007/1/4 11:30
7 sqlldr 2007/1/4 12:30 2007/1/4 13:30
8 sqlplus 2007/1/4 13:30 2007/1/4 14:30
9 sqlplusW 2007/1/4 18:00 2007/1/4 19:00
10 telnet 2007/1/4 18:20 2007/1/4 18:40
11 tnsping 2007/1/4 20:00 2007/1/4 21:00
TaskIDごとの最大多重度を求める。
例1 cmdは、2007/1/4 08:00に、cmdとnotepadとexpが起動しているので、最大多重度は3
例2 notepadは、2007/1/4 10:00に、notepadとexpとcalcとexcelとimpが起動しているので、最大多重度は5
例3 sqlplusWは、2007/1/4 18:20に、sqlplusWとtelnetが起動しているので、最大多重度は2
出力結果
TaskID ExeName StartTime EndTime 最大多重度
------ -------- -------------- -------------- ----------
1 cmd 2007/1/4 07:00 2007/1/4 08:00 3
2 notepad 2007/1/4 08:00 2007/1/4 11:00 5
3 exp 2007/1/4 08:00 2007/1/4 13:30 5
4 calc 2007/1/4 09:00 2007/1/4 13:00 5
5 excel 2007/1/4 09:00 2007/1/4 15:30 5
6 imp 2007/1/4 10:00 2007/1/4 11:30 5
7 sqlldr 2007/1/4 12:30 2007/1/4 13:30 4
8 sqlplus 2007/1/4 13:30 2007/1/4 14:30 4
9 sqlplusW 2007/1/4 18:00 2007/1/4 19:00 2
10 telnet 2007/1/4 18:20 2007/1/4 18:40 2
11 tnsping 2007/1/4 20:00 2007/1/4 21:00 1
create table TaskList(
TaskID number(2),
ExeName varchar2(8),
StartTime date,
EndTime date);
insert into TaskList values( 1,'cmd ' ,to_date('2007/1/4 07:00','fmyyyy/mm/dd fmHH24:MI')
,to_date('2007/1/4 08:00','fmyyyy/mm/dd fmHH24:MI'));
insert into TaskList values( 2,'notepad' ,to_date('2007/1/4 08:00','fmyyyy/mm/dd fmHH24:MI')
,to_date('2007/1/4 11:00','fmyyyy/mm/dd fmHH24:MI'));
insert into TaskList values( 3,'exp' ,to_date('2007/1/4 08:00','fmyyyy/mm/dd fmHH24:MI')
,to_date('2007/1/4 13:30','fmyyyy/mm/dd fmHH24:MI'));
insert into TaskList values( 4,'calc' ,to_date('2007/1/4 09:00','fmyyyy/mm/dd fmHH24:MI')
,to_date('2007/1/4 13:00','fmyyyy/mm/dd fmHH24:MI'));
insert into TaskList values( 5,'excel' ,to_date('2007/1/4 09:00','fmyyyy/mm/dd fmHH24:MI')
,to_date('2007/1/4 15:30','fmyyyy/mm/dd fmHH24:MI'));
insert into TaskList values( 6,'imp' ,to_date('2007/1/4 10:00','fmyyyy/mm/dd fmHH24:MI')
,to_date('2007/1/4 11:30','fmyyyy/mm/dd fmHH24:MI'));
insert into TaskList values( 7,'sqlldr' ,to_date('2007/1/4 12:30','fmyyyy/mm/dd fmHH24:MI')
,to_date('2007/1/4 13:30','fmyyyy/mm/dd fmHH24:MI'));
insert into TaskList values( 8,'sqlplus' ,to_date('2007/1/4 13:30','fmyyyy/mm/dd fmHH24:MI')
,to_date('2007/1/4 14:30','fmyyyy/mm/dd fmHH24:MI'));
insert into TaskList values( 9,'sqlplusW',to_date('2007/1/4 18:00','fmyyyy/mm/dd fmHH24:MI')
,to_date('2007/1/4 19:00','fmyyyy/mm/dd fmHH24:MI'));
insert into TaskList values(10,'telnet' ,to_date('2007/1/4 18:20','fmyyyy/mm/dd fmHH24:MI')
,to_date('2007/1/4 18:40','fmyyyy/mm/dd fmHH24:MI'));
insert into TaskList values(11,'tnsping' ,to_date('2007/1/4 20:00','fmyyyy/mm/dd fmHH24:MI')
,to_date('2007/1/4 21:00','fmyyyy/mm/dd fmHH24:MI'));
commit;
select a.TaskID,a.ExeName,
to_char(a.StartTime,'fmyyyy/mm/dd fmHH24:MI') as StartTime,
to_char(a.EndTime, 'fmyyyy/mm/dd fmHH24:MI') as EndTime,
max((select count(*) from TaskList c
where b.CheckTime between c.StartTime and c.EndTime)) as 最大多重度
from TaskList a,(select d.StartTime as CheckTime from TaskList d
union select d.EndTime from TaskList d) b
where b.CheckTime between a.StartTime and a.EndTime
group by a.TaskID,a.ExeName,
to_char(a.StartTime,'fmyyyy/mm/dd fmHH24:MI'),
to_char(a.EndTime, 'fmyyyy/mm/dd fmHH24:MI')
order by a.TaskID;
インラインビューでunionを使って、 最大多重度となる時間の候補の和集合を作成し、結合してます。