>>>checkdate xclusive id1 id2 nstart nend >>>---------- -------- --- --- ------ ---- >>>01/01/2003 F 1 1 96 120 >>>01/01/2003 F 1 1 108 120 >>>01/01/2003 F 1 1 108 120 >>>01/01/2003 F 1 1 108 120 >>> >>>01/01/2003 F 2 1 96 108 >>>01/01/2003 F 2 1 102 120 >>>01/01/2003 F 2 1 102 120 >>> >>>01/02/2003 F 2 1 96 108 >>>01/02/2003 F 2 1 96 132 >>>01/02/2003 F 2 1 102 108 >>>01/02/2003 F 2 1 102 120 >>>01/02/2003 F 2 1 102 120 >>>>>>Start,End are in the range 1,186.
>>>checkdate xclusive id1 id2 nstart nend cnts >>>---------- -------- --- --- ------ ---- ---- >>>01/01/2003 F 1 1 96 108 1 >>>01/01/2003 F 1 1 108 120 4 >>> >>>01/01/2003 F 2 1 96 102 1 >>>01/01/2003 F 2 1 102 108 3 >>>01/01/2003 F 2 1 108 120 2 >>> >>>01/02/2003 F 2 1 96 102 2 >>>01/02/2003 F 2 1 102 108 5 >>>01/02/2003 F 2 1 108 120 3 >>>01/02/2003 F 2 1 120 132 1 >>>>>>
>>function ppdo_it() >> >> create cursor test ; >> ( Checkdate D default {}, ; >> Excl c(1) default '', ; >> Id1 I default 0, ; >> Id2 I default 0, ; >> nStart I default 0, ; >> nEnd I default 0 ; >> ) >> insert into Test values({01/01/2003}, 'F', 1, 1, 96, 120 ) >> insert into Test values({01/01/2003}, 'F', 1, 1, 108, 120 ) >> insert into Test values({01/01/2003}, 'F', 1, 1, 108, 120 ) >> insert into Test values({01/01/2003}, 'F', 1, 1, 108, 120 ) >> >> insert into Test values({01/01/2003}, 'F', 2, 1, 96, 108 ) >> insert into Test values({01/01/2003}, 'F', 2, 1, 102, 120 ) >> insert into Test values({01/01/2003}, 'F', 2, 1, 102, 120 ) >> >> insert into Test values({01/02/2003}, 'F', 2, 1, 96, 108 ) >> insert into Test values({01/02/2003}, 'F', 2, 1, 96, 132 ) >> insert into Test values({01/02/2003}, 'F', 2, 1, 102, 108 ) >> insert into Test values({01/02/2003}, 'F', 2, 1, 102, 120 ) >> insert into Test values({01/02/2003}, 'F', 2, 1, 102, 120 ) >>*!* >> && Need Collate Machine >> local sCollate >> sCollate = set('Collate') >> set Collate to 'Machine' >> >> && (1) Speed >> select dtos(CheckDate) + excl + bintoc(Id1) + bintoc(Id2) as tmpGroup, ; >> recno() as rec, ; >> CheckDate, ; >> Excl, ; >> Id1, ; >> Id2, ; >> nStart, ; >> nEnd ; >> from Test ; >> into cursor Test1 ; >> order by 1 >> >> >> && (2) All lines start at nStart >> && intermediate stops at all (nStart, nEnd ) where (nStart, nEnd) <= nEnd >> select d1.tmpGroup, ; >> d1.rec, ; >> d1.CheckDate, ; >> d1.Excl, ; >> d1.Id1, ; >> d1.Id2, ; >> d1.nStart, ; >> d1.nEnd, ; >> d2.nStart as Intermediate ; >> from test1 d1, Test1 d2 ; >> into cursor test2 ; >> where ( d1.tmpGroup == d2.TmpGroup ) ; >> and ( d2.nStart between d1.nStart and d1.nEnd ) ; >> union ; >> select d1.tmpGroup, ; >> d1.rec, ; >> d1.CheckDate, ; >> d1.Excl, ; >> d1.Id1, ; >> d1.Id2, ; >> d1.nStart, ; >> d1.nEnd, ; >> d2.nEnd as Intermediate ; >> from test1 d1, Test1 d2 ; >> where ( d1.tmpGroup == d2.TmpGroup ) ; >> and ( d2.nEnd between d1.nStart and d1.nEnd ) ; >> >> && add recno for upcoming self join >> select tmpGroup as tmpGroup, ; >> rec, ; >> CheckDate, ; >> Excl, ; >> Id1, ; >> Id2, ; >> nStart, ; >> nEnd, ; >> Intermediate, ; >> recno() as nrec ; >> from Test2 ; >> into cursor Test3 ; >> >> && >> select d1.tmpGroup, ; >> d1.rec, ; >> d1.CheckDate, ; >> d1.Excl, ; >> d1.Id1, ; >> d1.Id2, ; >> d1.nStart, ; >> d1.nEnd, ; >> d1.nRec, ; >> d2.nrec, ; >> d1.Intermediate as x1, ; >> d2.Intermediate as x2 ; >> from test3 d1, Test3 d2 ; >> into cursor test4 ; >> where ( d1.tmpGroup == d2.TmpGroup ) ; >> and ( d1.rec == d2.rec ) ; >> and ( d1.nrec+1 == d2.nrec ) ; >> order by 1, 2, x1, x2 >> >> >> && Final >> select CheckDate, ; >> Excl, ; >> Id1, ; >> Id2, ; >> x1 as nStart, ; >> x2 as nEnd, ; >> cnt(*) as cnts ; >> from Test4 ; >> into cursor Result ; >> group by tmpGroup, 5, 6 >> >> set Collate to (sCollate) >> >>endfunc >>*--------------------------------------------------------------------------- >>