<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>topic Re: Cartesian type product within a group in SAS Programming</title>
    <link>https://communities.sas.com/t5/SAS-Programming/Cartesian-type-product-within-a-group/m-p/480585#M124219</link>
    <description>&lt;P&gt;Thank you Sir&amp;nbsp;&lt;a href="https://communities.sas.com/t5/user/viewprofilepage/user-id/13711"&gt;@art297&lt;/a&gt;, will this one compete with yours?&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;data have;
infile cards truncover;
informat id $1. event $15. start end ddmmyy10.;
input id event  start end;
format start end date10.;
cards;
1 Headache 30-01-2017 08-02-2017
1 Headache 25-01-2017 03-02-2017 
1 vomiting 04-02-2017 05-02-2017
4 Nausea 20-11-2017 31-12-2017
4 Nausea 03-11-2017 05-11-2017
;
run;
data want;
if _n_=1 then do;
if 0 then set have(rename=(start=start_date end=end_date));
 dcl hash h(dataset:'have(rename=(start=start_date end=end_date))', multidata: 'y', ordered: 'y');
 h.definekey('id','event');
 h.definedata(all:'y');
 h.definedone();
 end;
 set have;
 by id event;
 do while(h.do_over(key:id,key:event) eq 0);
  output;
end;
run;&lt;/CODE&gt;&lt;/PRE&gt;</description>
    <pubDate>Mon, 23 Jul 2018 18:43:39 GMT</pubDate>
    <dc:creator>novinosrin</dc:creator>
    <dc:date>2018-07-23T18:43:39Z</dc:date>
    <item>
      <title>Cartesian type product within a group</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Cartesian-type-product-within-a-group/m-p/480530#M124202</link>
      <description>&lt;P&gt;Hi all,&lt;/P&gt;&lt;P&gt;&amp;nbsp;here's&amp;nbsp;my dataset&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;data have;
input id event$ start end;
informat start end ddmmyy10.;
format start end date10.;
cards;
1 Headache 30-01-2017 08-02-2017
1 Headache 25-01-2017 03-02-2017&lt;BR /&gt;1 vomiting 04-02-2017 05-02-2017
4 Nausea 20-11-2017 31-12-2017
4 Nausea 03-11-2017 05-11-2017
;
run;&lt;/CODE&gt;&lt;/PRE&gt;&lt;P&gt;i am trying to get cartesian type product within a group i.e combination of all rows within a group(&lt;STRONG&gt;BY id event;&lt;/STRONG&gt;).&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Expecting output by using &lt;STRONG&gt;DATA STEP, NOT BY PROC SQL&lt;/STRONG&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;TABLE&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD&gt;&lt;P&gt;&lt;STRONG&gt;id&lt;/STRONG&gt;&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;&lt;STRONG&gt;Event&lt;/STRONG&gt;&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;&lt;STRONG&gt;Start&lt;/STRONG&gt;&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;&lt;STRONG&gt;End&lt;/STRONG&gt;&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;&lt;STRONG&gt;Start_date&lt;/STRONG&gt;&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;&lt;STRONG&gt;End_date&lt;/STRONG&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;&lt;P&gt;1&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;Headache&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;30JAN2017&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;08FEB2017&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;30JAN2017&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;08FEB2017&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;&lt;P&gt;1&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;Headache&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;30JAN2017&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;08FEB2017&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;25JAN2017&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;03FEB2017&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;&lt;P&gt;1&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;Headache&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;25JAN2017&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;03FEB2017&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;30JAN2017&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;08FEB2017&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;&lt;P&gt;1&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;Headache&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;25JAN2017&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;03FEB2017&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;25JAN2017&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;03FEB2017&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;&lt;P&gt;1&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;Vomiting&amp;nbsp;&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;04FEB2017&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;05FEB2017&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;04FEB2017&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;05FEB2017&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;&lt;P&gt;4&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;Nausea&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;20NOV2017&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;31DEC2017&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;20NOV2017&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;31DEC2017&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;&lt;P&gt;4&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;Nausea&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;20NOV2017&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;31DEC2017&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;03NOV2017&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;05NOV2017&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;&lt;P&gt;4&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;Nausea&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;03NOV2017&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;05NOV2017&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;20NOV2017&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;31DEC2017&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;&lt;P&gt;4&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;Nausea&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;03NOV2017&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;05NOV2017&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;03NOV2017&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;05NOV2017&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Thank you in advance,&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Mon, 23 Jul 2018 16:50:03 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Cartesian-type-product-within-a-group/m-p/480530#M124202</guid>
      <dc:creator>s_manoj</dc:creator>
      <dc:date>2018-07-23T16:50:03Z</dc:date>
    </item>
    <item>
      <title>Re: Cartesian type product within a group</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Cartesian-type-product-within-a-group/m-p/480540#M124206</link>
      <description>&lt;P&gt;Why do you want to specify the tool when Proc SQL does this much easier?&lt;/P&gt;</description>
      <pubDate>Mon, 23 Jul 2018 17:20:12 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Cartesian-type-product-within-a-group/m-p/480540#M124206</guid>
      <dc:creator>ballardw</dc:creator>
      <dc:date>2018-07-23T17:20:12Z</dc:date>
    </item>
    <item>
      <title>Re: Cartesian type product within a group</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Cartesian-type-product-within-a-group/m-p/480551#M124210</link>
      <description>&lt;P&gt;I agree with&amp;nbsp;&lt;a href="https://communities.sas.com/t5/user/viewprofilepage/user-id/13884"&gt;@ballardw&lt;/a&gt;! It would be much easier using proc sql. However, here is one way you could do it using a datastep:&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;data have;
  input id event $ start end;
  informat start end ddmmyy10.;
  format start end date10.;
  cards;
1 Headache 30-01-2017 08-02-2017
1 Headache 25-01-2017 03-02-2017
1 vomiting 04-02-2017 05-02-2017
4 Nausea 20-11-2017 31-12-2017
4 Nausea 03-11-2017 05-11-2017
;

data every_combination;
  do until (last.event);
    set have;
    by id event;
    i+1;
    if first.event then j=i;
    if last.event then n=i;
  end;
  do until (last.event);
    set have;
    by id event;
    output;
  end;
run;

data every_combination (drop=i j n);
  set every_combination;
  do k=j to n;
    set have (rename=(start=start_date end=end_date)) point=k;
    output;
  end;
run;
&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;Art, CEO, AnalystFinder.com&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Mon, 23 Jul 2018 18:12:26 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Cartesian-type-product-within-a-group/m-p/480551#M124210</guid>
      <dc:creator>art297</dc:creator>
      <dc:date>2018-07-23T18:12:26Z</dc:date>
    </item>
    <item>
      <title>Re: Cartesian type product within a group</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Cartesian-type-product-within-a-group/m-p/480560#M124213</link>
      <description>&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;data have;
infile cards truncover;
informat id $1. event $15. start end ddmmyy10.;
input id event  start end;
format start end date10.;
cards;
1 Headache 30-01-2017 08-02-2017
1 Headache 25-01-2017 03-02-2017 
1 vomiting 04-02-2017 05-02-2017
4 Nausea 20-11-2017 31-12-2017
4 Nausea 03-11-2017 05-11-2017
;
run;

data want;
set have;
do _n_=1 to nobs;
set have(rename=(id=_id event=_event start=start_date end=end_date)) nobs=nobs point=_n_;
if id=_id and event=_event then output;
end;
drop _:;
run;&lt;/CODE&gt;&lt;/PRE&gt;</description>
      <pubDate>Mon, 23 Jul 2018 17:52:28 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Cartesian-type-product-within-a-group/m-p/480560#M124213</guid>
      <dc:creator>novinosrin</dc:creator>
      <dc:date>2018-07-23T17:52:28Z</dc:date>
    </item>
    <item>
      <title>Re: Cartesian type product within a group</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Cartesian-type-product-within-a-group/m-p/480581#M124217</link>
      <description>&lt;P&gt;&lt;a href="https://communities.sas.com/t5/user/viewprofilepage/user-id/138205"&gt;@novinosrin&lt;/a&gt;: Methinks: bad suggestion! While your suggested&amp;nbsp;solution is definitely less complex than the one I offered, it doesn't meet an acceptable performance level (unless the file only contains the five example records posted).&lt;/P&gt;
&lt;P&gt;On a relatively small file (50,000) records your code runs 5,053 times slower than the code I proposed. That time grows exponentially with even more records in the dataset.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Art, CEO, AnalystFinder.com&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Mon, 23 Jul 2018 18:35:17 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Cartesian-type-product-within-a-group/m-p/480581#M124217</guid>
      <dc:creator>art297</dc:creator>
      <dc:date>2018-07-23T18:35:17Z</dc:date>
    </item>
    <item>
      <title>Re: Cartesian type product within a group</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Cartesian-type-product-within-a-group/m-p/480585#M124219</link>
      <description>&lt;P&gt;Thank you Sir&amp;nbsp;&lt;a href="https://communities.sas.com/t5/user/viewprofilepage/user-id/13711"&gt;@art297&lt;/a&gt;, will this one compete with yours?&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;data have;
infile cards truncover;
informat id $1. event $15. start end ddmmyy10.;
input id event  start end;
format start end date10.;
cards;
1 Headache 30-01-2017 08-02-2017
1 Headache 25-01-2017 03-02-2017 
1 vomiting 04-02-2017 05-02-2017
4 Nausea 20-11-2017 31-12-2017
4 Nausea 03-11-2017 05-11-2017
;
run;
data want;
if _n_=1 then do;
if 0 then set have(rename=(start=start_date end=end_date));
 dcl hash h(dataset:'have(rename=(start=start_date end=end_date))', multidata: 'y', ordered: 'y');
 h.definekey('id','event');
 h.definedata(all:'y');
 h.definedone();
 end;
 set have;
 by id event;
 do while(h.do_over(key:id,key:event) eq 0);
  output;
end;
run;&lt;/CODE&gt;&lt;/PRE&gt;</description>
      <pubDate>Mon, 23 Jul 2018 18:43:39 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Cartesian-type-product-within-a-group/m-p/480585#M124219</guid>
      <dc:creator>novinosrin</dc:creator>
      <dc:date>2018-07-23T18:43:39Z</dc:date>
    </item>
    <item>
      <title>Re: Cartesian type product within a group</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Cartesian-type-product-within-a-group/m-p/480588#M124220</link>
      <description>&lt;P&gt;Much better! Runs slightly slower than the DOW approach (.06 seconds vs .05 seconds).&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;FWIW: Here is the code I ran to compare the three methods:&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;data have;
  input id event $ start end;
  informat start end ddmmyy10.;
  format start end date10.;
  if id=1 then do id=1 to 10000;
    output;
  end;
  else if id=4 then do id=10001 to 20000;
    output;
  end;
  cards;
1 Headache 30-01-2017 08-02-2017
1 Headache 25-01-2017 03-02-2017
1 vomiting 04-02-2017 05-02-2017
4 Nausea 20-11-2017 31-12-2017
4 Nausea 03-11-2017 05-11-2017
;

proc sort data=have;
  by id event;
run;

data every_combination;
  do until (last.event);
    set have;
    by id event;
    i+1;
    if first.event then j=i;
    if last.event then n=i;
  end;
  do until (last.event);
    set have;
    by id event;
    output;
  end;
run;

data every_combination (drop=i j n);
  set every_combination;
  do k=j to n;
    set have (rename=(start=start_date end=end_date)) point=k;
    output;
  end;
run;

data want;
  set have;
  do _n_=1 to nobs;
  set have(rename=(id=_id event=_event start=start_date end=end_date)) nobs=nobs point=_n_;
  if id=_id and event=_event then output;
  end;
  drop _:;
run;

data want;
if _n_=1 then do;
if 0 then set have(rename=(start=start_date end=end_date));
 dcl hash h(dataset:'have(rename=(start=start_date end=end_date))', multidata: 'y', ordered: 'y');
 h.definekey('id','event');
 h.definedata(all:'y');
 h.definedone();
 end;
 set have;
 by id event;
 do while(h.do_over(key:id,key:event) eq 0);
  output;
end;
run;
&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;Art, CEO, AnalystFinder.com&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Mon, 23 Jul 2018 19:00:27 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Cartesian-type-product-within-a-group/m-p/480588#M124220</guid>
      <dc:creator>art297</dc:creator>
      <dc:date>2018-07-23T19:00:27Z</dc:date>
    </item>
    <item>
      <title>Re: Cartesian type product within a group</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Cartesian-type-product-within-a-group/m-p/480594#M124221</link>
      <description>&lt;P&gt;&lt;a href="https://communities.sas.com/t5/user/viewprofilepage/user-id/13711"&gt;@art297&lt;/a&gt;&amp;nbsp;Thank you Sir for the interactive feedback. I am afraid&amp;nbsp; at Depaul college lab, we can't operate(test) with large datasets and so your inputs(if and when you have time) does matter big time.&amp;nbsp; But I think 50,000 records should be possible for me to test which I will do so in future.&amp;nbsp; Thanks as always. I can't appreciate enough&lt;/P&gt;</description>
      <pubDate>Mon, 23 Jul 2018 19:06:30 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Cartesian-type-product-within-a-group/m-p/480594#M124221</guid>
      <dc:creator>novinosrin</dc:creator>
      <dc:date>2018-07-23T19:06:30Z</dc:date>
    </item>
  </channel>
</rss>

