>>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 >*--------------------------------------------------------------------------- >