<?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: how to split a dataset into 300 sub datasets in SAS Programming</title>
    <link>https://communities.sas.com/t5/SAS-Programming/how-to-split-a-dataset-into-300-sub-datasets/m-p/119402#M24573</link>
    <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;I cannot remember the maximum number of datasets a single data statement can open at a time, but in case 300 breaches that limit here are two variations on the same method to use a hash object to split out your subgroups.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;/* test data */&lt;/P&gt;&lt;P&gt;data have;&lt;/P&gt;&lt;P&gt; format id best. dt date9.;&lt;/P&gt;&lt;P&gt; drop min;&lt;/P&gt;&lt;P&gt; min=intnx('year',today(),-25);&lt;/P&gt;&lt;P&gt; do id=1 to 10000;&lt;/P&gt;&lt;P&gt;&amp;nbsp; dt= min + floor((1+today()-min)*ranuni(1234));&lt;/P&gt;&lt;P&gt;&amp;nbsp; output;&lt;/P&gt;&lt;P&gt; end;&lt;/P&gt;&lt;P&gt;run;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;/* method 1, no treatment */&lt;/P&gt;&lt;P&gt;data _null_;&lt;/P&gt;&lt;P&gt;&amp;nbsp; if 0 then set have;&lt;/P&gt;&lt;P&gt;&amp;nbsp; split=intnx('year',today(),-25,'s');&lt;/P&gt;&lt;P&gt;&amp;nbsp; do while(split&amp;lt;=today());&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; declare hash mon(ordered: 'a');&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; mon.definekey('id','dt','_n_');&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; mon.definedata('id','dt');&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; mon.definedone();&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; dsname=cats('have(where=(',intnx('month',split,0,'b'),'&amp;lt;=dt&amp;lt;=',intnx('month',split,0,'e'),'))');&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; dsid=open( dsname );&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; do _n_=1 by 1 until(rc ne 0);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; call set (dsid) ;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; rc=fetch(dsid);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; mon.add();&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; end;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; dsid=close(dsid);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; mon.output (dataset: cats('yr',year(split),'m',month(split),'_mkdata'));&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; split=intnx('month',split,1,'s');&lt;/P&gt;&lt;P&gt;&amp;nbsp; end;&lt;/P&gt;&lt;P&gt;&amp;nbsp; stop;&lt;/P&gt;&lt;P&gt;run;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;/* method 2 - treat with view */&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;proc sql;&lt;/P&gt;&lt;P&gt; create view _have as&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; select id,&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dt,&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cats('yr',year(dt),'m',month(dt),'_mkdata') as split &lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; from have &lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; order by split,id,dt&lt;/P&gt;&lt;P&gt; ;&lt;/P&gt;&lt;P&gt;quit;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;data _null_;&lt;/P&gt;&lt;P&gt; declare hash mon();&lt;/P&gt;&lt;P&gt;&amp;nbsp; mon.definekey('id','dt','_n_');&lt;/P&gt;&lt;P&gt;&amp;nbsp; mon.definedata('id','dt');&lt;/P&gt;&lt;P&gt; mon.definedone();&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt; do _n_=1 by 1 until(last.split);&lt;/P&gt;&lt;P&gt;&amp;nbsp; set _have;&lt;/P&gt;&lt;P&gt;&amp;nbsp; by split;&lt;/P&gt;&lt;P&gt;&amp;nbsp; mon.add();&lt;/P&gt;&lt;P&gt; end;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt; mon.output(dataset:split);&lt;/P&gt;&lt;P&gt;run;&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
    <pubDate>Mon, 25 Feb 2013 22:06:56 GMT</pubDate>
    <dc:creator>FriedEgg</dc:creator>
    <dc:date>2013-02-25T22:06:56Z</dc:date>
    <item>
      <title>how to split a dataset into 300 sub datasets</title>
      <link>https://communities.sas.com/t5/SAS-Programming/how-to-split-a-dataset-into-300-sub-datasets/m-p/119396#M24567</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;&lt;STRONG&gt;currently I have a working code, whereI split a dataset(of 25 years) into 25 different sub datasets and process each of the sub dataset in a macro(working code below;repetitive code indicated by ...);so far so good. My requirement is I need to split this dataset by monthly and my question is what is the best way to do it. If it were C++, I'd use a for loop to go over the dataset and store each sub dataset as an array element and pass each array element to the macro; how would I do it in SAS. Clearly, the approach that I followed below is inefficient, because that would require having 300 sub datasets and a code repeted over 300 times; (PS:I am new to SAS); thank you in advance&lt;/STRONG&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;BR /&gt;*split the time series for each year to accomodate LM12;&lt;BR /&gt;data&amp;nbsp; yr1989mktdata ....... yr2000mktdata yr2001mktdata yr2002mktdata yr2003mktdata yr2004mktdata&lt;BR /&gt; yr2005mktdata yr2006mktdata yr2007mktdata yr2008mktdata&amp;nbsp; yr2009mktdata yr2010mktdata yr2011mktdata&amp;nbsp; yr2012mktdata&amp;nbsp; ;&lt;BR /&gt; set mktdata;&lt;/P&gt;&lt;P&gt;&amp;nbsp; if date &amp;gt; '1jan1989'd and date &amp;lt;= '31dec1989'd then&lt;BR /&gt; output yr1989mktdata;&lt;/P&gt;&lt;P&gt;....&lt;/P&gt;&lt;P&gt;..&lt;/P&gt;&lt;P&gt;...&lt;/P&gt;&lt;P&gt;...&lt;/P&gt;&lt;P&gt; else if date &amp;gt; '1jan2000'd and date &amp;lt;= '31dec2000'd then&lt;BR /&gt; output yr2000mktdata;&lt;/P&gt;&lt;P&gt; else if date &amp;gt; '1jan2001'd and date &amp;lt;= '31dec2001'd then&lt;BR /&gt; output yr2001mktdata;&lt;/P&gt;&lt;P&gt; else if date &amp;gt; '1jan2002'd and date &amp;lt;= '31dec2002'd then&lt;BR /&gt; output yr2002mktdata;&lt;/P&gt;&lt;P&gt; else if date &amp;gt; '1jan2003'd and date &amp;lt;= '31dec2003'd then&lt;BR /&gt; output yr2003mktdata;&lt;/P&gt;&lt;P&gt; else if date &amp;gt; '1jan2004'd and date &amp;lt;= '31dec2004'd then&lt;BR /&gt; output yr2004mktdata;&lt;/P&gt;&lt;P&gt; else if date &amp;gt; '1jan2005'd and date &amp;lt;= '31dec2005'd then&lt;BR /&gt; output yr2005mktdata;&lt;/P&gt;&lt;P&gt; else if date &amp;gt; '1jan2006'd and date &amp;lt;= '31dec2006'd then&lt;BR /&gt; output yr2006mktdata;&lt;/P&gt;&lt;P&gt; else if date &amp;gt; '1jan2007'd and date &amp;lt;= '31dec2007'd then&lt;BR /&gt; output yr2007mktdata;&lt;/P&gt;&lt;P&gt;.............&lt;/P&gt;&lt;P&gt;...........&lt;/P&gt;&lt;P&gt;.......... &lt;/P&gt;&lt;P&gt;run;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;%macro LMGenerate(submktdata,yeartag);&lt;/P&gt;&lt;P&gt;%mend&amp;nbsp; LMGenerate;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;%LMGenerate(yr1989mktdata,1989)&lt;/P&gt;&lt;P&gt;...&lt;/P&gt;&lt;P&gt;....&lt;/P&gt;&lt;P&gt;....&lt;/P&gt;&lt;P&gt;%LMGenerate(yr2000mktdata,2000)&lt;/P&gt;&lt;P&gt;%LMGenerate(yr2001mktdata,2001)&lt;/P&gt;&lt;P&gt;%LMGenerate(yr2002mktdata,2002)&lt;/P&gt;&lt;P&gt;%LMGenerate(yr2003mktdata,2003)&lt;/P&gt;&lt;P&gt;...&lt;/P&gt;&lt;P&gt;...&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;%LMGenerate(yr2004mktdata,2012)&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Sun, 24 Feb 2013 00:00:10 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/how-to-split-a-dataset-into-300-sub-datasets/m-p/119396#M24567</guid>
      <dc:creator>kashili</dc:creator>
      <dc:date>2013-02-24T00:00:10Z</dc:date>
    </item>
    <item>
      <title>Re: how to split a dataset into 300 sub datasets</title>
      <link>https://communities.sas.com/t5/SAS-Programming/how-to-split-a-dataset-into-300-sub-datasets/m-p/119397#M24568</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Generally splitting the dataset up isn't recommended. Instead you should look into by group processing for SAS.&amp;nbsp; &lt;/P&gt;&lt;P&gt;SAS doesn't pull a dataset into memory, so the size of a dataset is less of an issue. Instead, it processes a dataset line by line, however sorting a dataset could take more time and memory depending on the size.&lt;/P&gt;&lt;P&gt;&lt;A class="active_link" href="http://www.lexjansen.com/wuss/2008/ess/ess11.pdf" title="http://www.lexjansen.com/wuss/2008/ess/ess11.pdf"&gt;http://www.lexjansen.com/wuss/2008/ess/ess11.pdf&lt;/A&gt;&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Sun, 24 Feb 2013 00:11:09 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/how-to-split-a-dataset-into-300-sub-datasets/m-p/119397#M24568</guid>
      <dc:creator>Reeza</dc:creator>
      <dc:date>2013-02-24T00:11:09Z</dc:date>
    </item>
    <item>
      <title>Re: how to split a dataset into 300 sub datasets</title>
      <link>https://communities.sas.com/t5/SAS-Programming/how-to-split-a-dataset-into-300-sub-datasets/m-p/119398#M24569</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;The example below may save you some typing:&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;data mktdata;&lt;/P&gt;&lt;P&gt;input date mmddyy10.;&lt;/P&gt;&lt;P&gt;format date mmddyy10.;&lt;/P&gt;&lt;P&gt;cards;&lt;/P&gt;&lt;P&gt;01/02/2000&lt;/P&gt;&lt;P&gt;01/02/2001&lt;/P&gt;&lt;P&gt;01/02/2002&lt;/P&gt;&lt;P&gt;01/02/2003&lt;/P&gt;&lt;P&gt;01/02/2004&lt;/P&gt;&lt;P&gt;;&lt;/P&gt;&lt;P&gt;%macro test;&lt;/P&gt;&lt;P&gt;&amp;nbsp; %do year=2000 %to 2004;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; data yr&amp;amp;year.mktdata;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; set mktdata(where=(year(date)=&amp;amp;year));&lt;/P&gt;&lt;P&gt;&amp;nbsp; run;&lt;/P&gt;&lt;P&gt;&amp;nbsp; %end;&lt;/P&gt;&lt;P&gt;%mend;&lt;/P&gt;&lt;P&gt;%test&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Sun, 24 Feb 2013 02:35:17 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/how-to-split-a-dataset-into-300-sub-datasets/m-p/119398#M24569</guid>
      <dc:creator>Linlin</dc:creator>
      <dc:date>2013-02-24T02:35:17Z</dc:date>
    </item>
    <item>
      <title>Re: how to split a dataset into 300 sub datasets</title>
      <link>https://communities.sas.com/t5/SAS-Programming/how-to-split-a-dataset-into-300-sub-datasets/m-p/119399#M24570</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;First, note that Reeza's comment may be 100% right.&amp;nbsp; We don't see the processing that takes place inside the macro for each data set, but it's possible that following Reeza's suggestion would eliminate macro language entirely.&amp;nbsp; It would look somethig like this:&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;data want;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; set have;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; year = year(date);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; month = month(date);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; if 1989 &amp;lt;= year &amp;lt;=&amp;nbsp; 2012;&lt;/P&gt;&lt;P&gt;run;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;proc sort data=want;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; by year;&lt;/P&gt;&lt;P&gt;run;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Then skip running a macro and instead process the complete data set using the statement BY YEAR.&amp;nbsp; We would need to know more about what's in the macro to know if that approach is feasiable.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;If you conclude that you really do need to process each subset separately, here are a few recommendations.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;1. Create the variables YEAR and MONTH.&amp;nbsp; It is cheaper to add extra variables than to call the YEAR()&amp;nbsp; and MONTH() functions multiple times.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;2. Macro language will let you generate 300 data set names without too much trouble, but it's a little tricky to get the leading 0 in the first 9 months.&amp;nbsp; You would need a macro along these lines:&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;data&amp;nbsp; %do year=1989 %to 2012;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; %do month=1 %to 12;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; yr&amp;amp;year._m%sysfunc(putn(&amp;amp;month, z2))&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; %end;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; %end;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;3.&amp;nbsp; To output observations, it sometimes becomes easier to delete the early records first.&amp;nbsp; That way, you only need to make one comparison instead of two.&amp;nbsp; In this case, however, you might group the ELSE logic a little differently.&amp;nbsp; For example:&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;year = year(date);&lt;/P&gt;&lt;P&gt;month = month(date);&lt;/P&gt;&lt;P&gt;if year &amp;lt; 1989 then delete;&lt;/P&gt;&lt;P&gt;else if year=1989 then do;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; if month=1 then output yr1989_m01;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; else if month=2 then output yr1989_m02;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; ...&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; else if month=12 then output yr1989_m12;&lt;/P&gt;&lt;P&gt;end;&lt;/P&gt;&lt;P&gt;else if year=1990 then do;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;4. Getting macro language to generate those IF/THEN statements is mildly complex.&amp;nbsp; Also consider whether SELECT logic would be easier for you:&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;select (year);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; when (1989) select (month);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; when (01) output yr1989_m01;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; when (02) output yr1989_m02;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ...&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; when (12) output yr1989_m12;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; end;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; ...&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; when (2012) select (month);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; when (01) output yr2012_m01;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ...&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; end;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; otherwise delete;&lt;/P&gt;&lt;P&gt;end;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;So the first decision is to look at the subsequent processing and determine whether it truly requires separate data sets or not.&amp;nbsp; If so, then the code here may come in handy.&amp;nbsp; But it's not a given.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Good luck.&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Sun, 24 Feb 2013 17:25:46 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/how-to-split-a-dataset-into-300-sub-datasets/m-p/119399#M24570</guid>
      <dc:creator>Astounding</dc:creator>
      <dc:date>2013-02-24T17:25:46Z</dc:date>
    </item>
    <item>
      <title>Re: how to split a dataset into 300 sub datasets</title>
      <link>https://communities.sas.com/t5/SAS-Programming/how-to-split-a-dataset-into-300-sub-datasets/m-p/119400#M24571</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;If you decide to go with &lt;A __default_attr="5253" __jive_macro_name="user" class="jive_macro jive_macro_user" data-objecttype="3" href="https://communities.sas.com/"&gt;&lt;/A&gt;'s suggestion #4, you can automate that quite a bit with a little bit of proc sql code.&amp;nbsp; e.g.:&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;data have;&lt;/P&gt;&lt;P&gt;&amp;nbsp; informat date date9.;&lt;/P&gt;&lt;P&gt;&amp;nbsp; input date;&lt;/P&gt;&lt;P&gt;&amp;nbsp; cards;&lt;/P&gt;&lt;P&gt;02jan2012&lt;/P&gt;&lt;P&gt;05jan2012&lt;/P&gt;&lt;P&gt;04feb2012&lt;/P&gt;&lt;P&gt;04apr2012&lt;/P&gt;&lt;P&gt;01may2012&lt;/P&gt;&lt;P&gt;02may2012&lt;/P&gt;&lt;P&gt;;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;proc sql noprint;&lt;/P&gt;&lt;P&gt;&amp;nbsp; select distinct "when ('"||put(date,monyy7.)||&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; "') output "||put(date,monyy7.)||";",&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; put(date,monyy7.)&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; into :dates separated by " ",&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; :outs separated by " "&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; from have&lt;/P&gt;&lt;P&gt;&amp;nbsp; ;&lt;/P&gt;&lt;P&gt;quit;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;data &amp;amp;outs. (drop=monthyear);&lt;/P&gt;&lt;P&gt;&amp;nbsp; set have;&lt;/P&gt;&lt;P&gt;&amp;nbsp; monthyear=put(date,monyy7.);&lt;/P&gt;&lt;P&gt;&amp;nbsp; select (monthyear);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;amp;dates.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; otherwise delete;&lt;/P&gt;&lt;P&gt;&amp;nbsp; end;&lt;/P&gt;&lt;P&gt;run;&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Sun, 24 Feb 2013 20:44:08 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/how-to-split-a-dataset-into-300-sub-datasets/m-p/119400#M24571</guid>
      <dc:creator>art297</dc:creator>
      <dc:date>2013-02-24T20:44:08Z</dc:date>
    </item>
    <item>
      <title>Re: how to split a dataset into 300 sub datasets</title>
      <link>https://communities.sas.com/t5/SAS-Programming/how-to-split-a-dataset-into-300-sub-datasets/m-p/119401#M24572</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Since this is a one-time solution&lt;/P&gt;&lt;P&gt;meaning cost does not matter,&lt;/P&gt;&lt;P&gt;I'll go with Art's SQL solution.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;see also:&lt;/P&gt;&lt;P&gt;&lt;A class="active_link" href="http://www.sascommunity.org/wiki/Category:Making_subsets" title="http://www.sascommunity.org/wiki/Category:Making_subsets"&gt;http://www.sascommunity.org/wiki/Category:Making_subsets&lt;/A&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;and a Work in Progress:&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;A href="http://www.sascommunity.org/wiki/Macro_Loops_with_Dates" title="http://www.sascommunity.org/wiki/Macro_Loops_with_Dates"&gt;http://www.sascommunity.org/wiki/Macro_Loops_with_Dates&lt;/A&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Ron Fehd&amp;nbsp; list processing maven&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Mon, 25 Feb 2013 13:54:25 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/how-to-split-a-dataset-into-300-sub-datasets/m-p/119401#M24572</guid>
      <dc:creator>Ron_MacroMaven</dc:creator>
      <dc:date>2013-02-25T13:54:25Z</dc:date>
    </item>
    <item>
      <title>Re: how to split a dataset into 300 sub datasets</title>
      <link>https://communities.sas.com/t5/SAS-Programming/how-to-split-a-dataset-into-300-sub-datasets/m-p/119402#M24573</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;I cannot remember the maximum number of datasets a single data statement can open at a time, but in case 300 breaches that limit here are two variations on the same method to use a hash object to split out your subgroups.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;/* test data */&lt;/P&gt;&lt;P&gt;data have;&lt;/P&gt;&lt;P&gt; format id best. dt date9.;&lt;/P&gt;&lt;P&gt; drop min;&lt;/P&gt;&lt;P&gt; min=intnx('year',today(),-25);&lt;/P&gt;&lt;P&gt; do id=1 to 10000;&lt;/P&gt;&lt;P&gt;&amp;nbsp; dt= min + floor((1+today()-min)*ranuni(1234));&lt;/P&gt;&lt;P&gt;&amp;nbsp; output;&lt;/P&gt;&lt;P&gt; end;&lt;/P&gt;&lt;P&gt;run;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;/* method 1, no treatment */&lt;/P&gt;&lt;P&gt;data _null_;&lt;/P&gt;&lt;P&gt;&amp;nbsp; if 0 then set have;&lt;/P&gt;&lt;P&gt;&amp;nbsp; split=intnx('year',today(),-25,'s');&lt;/P&gt;&lt;P&gt;&amp;nbsp; do while(split&amp;lt;=today());&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; declare hash mon(ordered: 'a');&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; mon.definekey('id','dt','_n_');&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; mon.definedata('id','dt');&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; mon.definedone();&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; dsname=cats('have(where=(',intnx('month',split,0,'b'),'&amp;lt;=dt&amp;lt;=',intnx('month',split,0,'e'),'))');&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; dsid=open( dsname );&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; do _n_=1 by 1 until(rc ne 0);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; call set (dsid) ;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; rc=fetch(dsid);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; mon.add();&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; end;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; dsid=close(dsid);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; mon.output (dataset: cats('yr',year(split),'m',month(split),'_mkdata'));&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; split=intnx('month',split,1,'s');&lt;/P&gt;&lt;P&gt;&amp;nbsp; end;&lt;/P&gt;&lt;P&gt;&amp;nbsp; stop;&lt;/P&gt;&lt;P&gt;run;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;/* method 2 - treat with view */&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;proc sql;&lt;/P&gt;&lt;P&gt; create view _have as&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; select id,&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dt,&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cats('yr',year(dt),'m',month(dt),'_mkdata') as split &lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; from have &lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; order by split,id,dt&lt;/P&gt;&lt;P&gt; ;&lt;/P&gt;&lt;P&gt;quit;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;data _null_;&lt;/P&gt;&lt;P&gt; declare hash mon();&lt;/P&gt;&lt;P&gt;&amp;nbsp; mon.definekey('id','dt','_n_');&lt;/P&gt;&lt;P&gt;&amp;nbsp; mon.definedata('id','dt');&lt;/P&gt;&lt;P&gt; mon.definedone();&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt; do _n_=1 by 1 until(last.split);&lt;/P&gt;&lt;P&gt;&amp;nbsp; set _have;&lt;/P&gt;&lt;P&gt;&amp;nbsp; by split;&lt;/P&gt;&lt;P&gt;&amp;nbsp; mon.add();&lt;/P&gt;&lt;P&gt; end;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt; mon.output(dataset:split);&lt;/P&gt;&lt;P&gt;run;&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Mon, 25 Feb 2013 22:06:56 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/how-to-split-a-dataset-into-300-sub-datasets/m-p/119402#M24573</guid>
      <dc:creator>FriedEgg</dc:creator>
      <dc:date>2013-02-25T22:06:56Z</dc:date>
    </item>
    <item>
      <title>Re: how to split a dataset into 300 sub datasets</title>
      <link>https://communities.sas.com/t5/SAS-Programming/how-to-split-a-dataset-into-300-sub-datasets/m-p/119403#M24574</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;&lt;A __default_attr="733023" __jive_macro_name="user" class="jive_macro jive_macro_user" data-objecttype="3" href="https://communities.sas.com/"&gt;&lt;/A&gt;: If there is a limit to the number of files one can output, other than memory, I haven't found it.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;I just ran some test code where I created 10,400 files in a single datastep and, if I weren't so tired, would have tried to expand it.&amp;nbsp; &lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Tue, 26 Feb 2013 05:15:48 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/how-to-split-a-dataset-into-300-sub-datasets/m-p/119403#M24574</guid>
      <dc:creator>art297</dc:creator>
      <dc:date>2013-02-26T05:15:48Z</dc:date>
    </item>
    <item>
      <title>Re: how to split a dataset into 300 sub datasets</title>
      <link>https://communities.sas.com/t5/SAS-Programming/how-to-split-a-dataset-into-300-sub-datasets/m-p/119404#M24575</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;thank you folks...i learnt from this thread.&lt;/P&gt;&lt;P&gt;I removed macro and rewrote using 'by' clause. code look simple and elegant..thanks again&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Tue, 26 Feb 2013 17:37:13 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/how-to-split-a-dataset-into-300-sub-datasets/m-p/119404#M24575</guid>
      <dc:creator>kashili</dc:creator>
      <dc:date>2013-02-26T17:37:13Z</dc:date>
    </item>
  </channel>
</rss>

