<?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: match 1:5 unique case controls... in SAS Programming</title>
    <link>https://communities.sas.com/t5/SAS-Programming/match-1-5-unique-case-controls/m-p/291557#M60408</link>
    <description>&lt;P&gt;I modified the data slightly to create three matches (there was none in your sample data). Here is a hash solution:&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;data have;
infile datalines missover;
input Obs	SSN	study	service_branch :$1.	sex :$6.	
    (service_entry_date	service_entry_date_low) (:mmddyy10.);
format service_entry_date	service_entry_date_low yymmdd10.;
datalines;
1	1	0	A	MALE	05/10/2010	05/10/2005
2	2	1	A	MALE	11/20/2006
3	3	0	M	MALE	10/07/2011	10/07/2010
4	4	1	A	MALE	06/22/2010
5	5	0	M	MALE	10/23/2007	10/23/2006
6	6	0	M	MALE	07/08/2013	07/08/2012
7	7	0	F	FEMALE	01/16/2007	01/16/2006
8	8	1	A	MALE	08/03/2006
9	9	0	F	MALE	01/20/2009	01/21/2008
10	10	0	A	MALE	01/06/2009	01/07/2005
11	11	0	A	MALE	03/18/2009	03/18/2008
12	12	1	N	FEMALE	04/19/2007
13	13	0	F	MALE	02/18/2014	02/18/2013
14	14	0	F	FEMALE	09/04/2007	09/04/2005
15	15	0	A	MALE	08/18/2014	08/18/2013
16	16	0	N	FEMALE	11/18/2013	11/18/2005
17	17	1	N	FEMALE	07/08/2014
18	18	0	N	MALE	03/11/2014	03/11/2013
19	19	0	N	MALE	09/17/2013	09/17/2012
20	20	0	N	MALE	03/13/2014	03/13/2013
;

proc sql;
create table match as
select a.ssn as e_ssn, b.ssn as ne_ssn
from 
    have as a inner join 
    have as b
        on  a.service_entry_date between b.service_entry_date and b.service_entry_date_low and 
            a.service_branch=b.service_branch and
            a.sex=b.sex
where a.study and not b.study
order by ne_ssn, rand("uniform");
create table cases as
select ssn as e_ssn, 0 as count from have where study;
quit;

data mSet;
if _n_ = 1 then do;
	declare hash w(dataset:"cases");
	w.definekey("e_ssn");
	w.definedata("count");
	w.definedone();
	call missing(e_ssn, count);
	end;
assigned = 0;
do until(last.ne_ssn);
    set match; by ne_ssn;
    if not assigned then do;
        if w.find() = 0 then do;
            if count &amp;lt; 5 then do;
                count + 1;
                w.replace();
                output;
                assigned = 1;
                end;
            end;
        end;
    end;
keep e_ssn ne_ssn;
run;

proc print; run;&lt;/CODE&gt;&lt;/PRE&gt;</description>
    <pubDate>Sun, 14 Aug 2016 03:55:09 GMT</pubDate>
    <dc:creator>PGStats</dc:creator>
    <dc:date>2016-08-14T03:55:09Z</dc:date>
    <item>
      <title>match 1:5 unique case controls...</title>
      <link>https://communities.sas.com/t5/SAS-Programming/match-1-5-unique-case-controls/m-p/291052#M60292</link>
      <description>&lt;P&gt;I have a dataset composed of 2.5 million subjects that contain case (study=1) and controls (study=0) . I need SAS coding to create a new dataset composed of all the cases plus five randomly selected controls for each case, matched by date, sex, and branch of service.&amp;nbsp;&amp;nbsp; Control should only be used once (if already assigned to a case, cannot be assigned to another case).&amp;nbsp; This is my attempt, but not correct...&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;data&lt;/STRONG&gt; tmp;&lt;/P&gt;
&lt;P&gt;set exp2.case exp2.control;&lt;/P&gt;
&lt;P&gt;rand_num=rand("uniform");&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;run&lt;/STRONG&gt;;&lt;/P&gt;
&lt;P&gt;*merge case/ control tables and assign random number;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;proc&lt;/STRONG&gt; &lt;STRONG&gt;sort&lt;/STRONG&gt; data=tmp;&lt;/P&gt;
&lt;P&gt;by ssn study rand_num;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;run&lt;/STRONG&gt;;&lt;/P&gt;
&lt;P&gt;* 'study' variable is 1=case 0=control;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;proc&lt;/STRONG&gt; &lt;STRONG&gt;rank&lt;/STRONG&gt; data=tmp out=tempR;&lt;/P&gt;
&lt;P&gt;by ssn study;&lt;/P&gt;
&lt;P&gt;var rand_num;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;run&lt;/STRONG&gt;;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;THIS CHANGED ALL RAND_NUM to ‘1’ WHICH I DON”T THINK IS CORRECT?&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;proc&lt;/STRONG&gt; &lt;STRONG&gt;sql&lt;/STRONG&gt;;&lt;/P&gt;
&lt;P&gt;create table exp2.match as&lt;/P&gt;
&lt;P&gt;select a.ssn as e_ssn, a.service_branch as e_service_branch, a.sex as e_sex, a.service_entry_date as e_service_entry_date, a.study,&lt;/P&gt;
&lt;P&gt;b.ssn as ne_ssn, b.service_branch as ne_service_branch, b.sex as ne_sex, b.service_entry_date as ne_service_entry_date, b.study&lt;/P&gt;
&lt;P&gt;from tempr as a inner join tempr as b&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; on( a.service_entry_date between b.service_entry_date and b.service_entry_date_low) and a.service_branch=b.service_branch and&lt;/P&gt;
&lt;P&gt;a.sex=b.sex and a.rand_num=ceil(b.rand_num/&lt;STRONG&gt;5&lt;/STRONG&gt;)&lt;/P&gt;
&lt;P&gt;where a.study and not b.study;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;quit&lt;/STRONG&gt;;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Data looks like this + 2 million encounters&lt;/P&gt;
&lt;DIV class="branch"&gt;
&lt;DIV&gt;
&lt;DIV align="center"&gt;
&lt;TABLE class="table" summary="Procedure Print: Data Set WORK.TEMPR" frame="box" rules="all" cellpadding="5" cellspacing="0"&gt;
&lt;THEAD&gt;
&lt;TR&gt;
&lt;TH class="r header" scope="col"&gt;Obs&lt;/TH&gt;
&lt;TH class="r header" scope="col"&gt;SSN&lt;/TH&gt;
&lt;TH class="r header" scope="col"&gt;study&lt;/TH&gt;
&lt;TH class="l header" scope="col"&gt;service_branch&lt;/TH&gt;
&lt;TH class="l header" scope="col"&gt;sex&lt;/TH&gt;
&lt;TH class="r header" scope="col"&gt;service_entry_date&lt;/TH&gt;
&lt;TH class="r header" scope="col"&gt;service_entry_date_low&lt;/TH&gt;
&lt;TH class="r header" scope="col"&gt;rand_num&lt;/TH&gt;
&lt;/TR&gt;
&lt;/THEAD&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TH class="r rowheader" scope="row"&gt;1&lt;/TH&gt;
&lt;TD class="r data"&gt;1&lt;/TD&gt;
&lt;TD class="r data"&gt;0&lt;/TD&gt;
&lt;TD class="l data"&gt;A&lt;/TD&gt;
&lt;TD class="l data"&gt;MALE&lt;/TD&gt;
&lt;TD class="r data"&gt;05/10/2010&lt;/TD&gt;
&lt;TD class="r data"&gt;05/10/2009&lt;/TD&gt;
&lt;TD class="r data"&gt;1&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TH class="r rowheader" scope="row"&gt;2&lt;/TH&gt;
&lt;TD class="r data"&gt;2&lt;/TD&gt;
&lt;TD class="r data"&gt;1&lt;/TD&gt;
&lt;TD class="l data"&gt;A&lt;/TD&gt;
&lt;TD class="l data"&gt;MALE&lt;/TD&gt;
&lt;TD class="r data"&gt;11/20/2006&lt;/TD&gt;
&lt;TD class="r data"&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD class="r data"&gt;1&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TH class="r rowheader" scope="row"&gt;3&lt;/TH&gt;
&lt;TD class="r data"&gt;3&lt;/TD&gt;
&lt;TD class="r data"&gt;0&lt;/TD&gt;
&lt;TD class="l data"&gt;M&lt;/TD&gt;
&lt;TD class="l data"&gt;MALE&lt;/TD&gt;
&lt;TD class="r data"&gt;10/07/2011&lt;/TD&gt;
&lt;TD class="r data"&gt;10/07/2010&lt;/TD&gt;
&lt;TD class="r data"&gt;1&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TH class="r rowheader" scope="row"&gt;4&lt;/TH&gt;
&lt;TD class="r data"&gt;4&lt;/TD&gt;
&lt;TD class="r data"&gt;1&lt;/TD&gt;
&lt;TD class="l data"&gt;A&lt;/TD&gt;
&lt;TD class="l data"&gt;MALE&lt;/TD&gt;
&lt;TD class="r data"&gt;06/22/2010&lt;/TD&gt;
&lt;TD class="r data"&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD class="r data"&gt;1&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TH class="r rowheader" scope="row"&gt;5&lt;/TH&gt;
&lt;TD class="r data"&gt;5&lt;/TD&gt;
&lt;TD class="r data"&gt;0&lt;/TD&gt;
&lt;TD class="l data"&gt;M&lt;/TD&gt;
&lt;TD class="l data"&gt;MALE&lt;/TD&gt;
&lt;TD class="r data"&gt;10/23/2007&lt;/TD&gt;
&lt;TD class="r data"&gt;10/23/2006&lt;/TD&gt;
&lt;TD class="r data"&gt;1&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TH class="r rowheader" scope="row"&gt;6&lt;/TH&gt;
&lt;TD class="r data"&gt;6&lt;/TD&gt;
&lt;TD class="r data"&gt;0&lt;/TD&gt;
&lt;TD class="l data"&gt;M&lt;/TD&gt;
&lt;TD class="l data"&gt;MALE&lt;/TD&gt;
&lt;TD class="r data"&gt;07/08/2013&lt;/TD&gt;
&lt;TD class="r data"&gt;07/08/2012&lt;/TD&gt;
&lt;TD class="r data"&gt;1&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TH class="r rowheader" scope="row"&gt;7&lt;/TH&gt;
&lt;TD class="r data"&gt;7&lt;/TD&gt;
&lt;TD class="r data"&gt;0&lt;/TD&gt;
&lt;TD class="l data"&gt;F&lt;/TD&gt;
&lt;TD class="l data"&gt;FEMALE&lt;/TD&gt;
&lt;TD class="r data"&gt;01/16/2007&lt;/TD&gt;
&lt;TD class="r data"&gt;01/16/2006&lt;/TD&gt;
&lt;TD class="r data"&gt;1&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TH class="r rowheader" scope="row"&gt;8&lt;/TH&gt;
&lt;TD class="r data"&gt;8&lt;/TD&gt;
&lt;TD class="r data"&gt;1&lt;/TD&gt;
&lt;TD class="l data"&gt;A&lt;/TD&gt;
&lt;TD class="l data"&gt;MALE&lt;/TD&gt;
&lt;TD class="r data"&gt;08/03/2006&lt;/TD&gt;
&lt;TD class="r data"&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD class="r data"&gt;1&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TH class="r rowheader" scope="row"&gt;9&lt;/TH&gt;
&lt;TD class="r data"&gt;9&lt;/TD&gt;
&lt;TD class="r data"&gt;0&lt;/TD&gt;
&lt;TD class="l data"&gt;F&lt;/TD&gt;
&lt;TD class="l data"&gt;MALE&lt;/TD&gt;
&lt;TD class="r data"&gt;01/20/2009&lt;/TD&gt;
&lt;TD class="r data"&gt;01/21/2008&lt;/TD&gt;
&lt;TD class="r data"&gt;1&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TH class="r rowheader" scope="row"&gt;10&lt;/TH&gt;
&lt;TD class="r data"&gt;10&lt;/TD&gt;
&lt;TD class="r data"&gt;0&lt;/TD&gt;
&lt;TD class="l data"&gt;A&lt;/TD&gt;
&lt;TD class="l data"&gt;MALE&lt;/TD&gt;
&lt;TD class="r data"&gt;01/06/2009&lt;/TD&gt;
&lt;TD class="r data"&gt;01/07/2008&lt;/TD&gt;
&lt;TD class="r data"&gt;1&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TH class="r rowheader" scope="row"&gt;11&lt;/TH&gt;
&lt;TD class="r data"&gt;11&lt;/TD&gt;
&lt;TD class="r data"&gt;0&lt;/TD&gt;
&lt;TD class="l data"&gt;A&lt;/TD&gt;
&lt;TD class="l data"&gt;MALE&lt;/TD&gt;
&lt;TD class="r data"&gt;03/18/2009&lt;/TD&gt;
&lt;TD class="r data"&gt;03/18/2008&lt;/TD&gt;
&lt;TD class="r data"&gt;1&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TH class="r rowheader" scope="row"&gt;12&lt;/TH&gt;
&lt;TD class="r data"&gt;12&lt;/TD&gt;
&lt;TD class="r data"&gt;1&lt;/TD&gt;
&lt;TD class="l data"&gt;A&lt;/TD&gt;
&lt;TD class="l data"&gt;FEMALE&lt;/TD&gt;
&lt;TD class="r data"&gt;04/19/2007&lt;/TD&gt;
&lt;TD class="r data"&gt;.&lt;/TD&gt;
&lt;TD class="r data"&gt;1&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TH class="r rowheader" scope="row"&gt;13&lt;/TH&gt;
&lt;TD class="r data"&gt;13&lt;/TD&gt;
&lt;TD class="r data"&gt;0&lt;/TD&gt;
&lt;TD class="l data"&gt;F&lt;/TD&gt;
&lt;TD class="l data"&gt;MALE&lt;/TD&gt;
&lt;TD class="r data"&gt;02/18/2014&lt;/TD&gt;
&lt;TD class="r data"&gt;02/18/2013&lt;/TD&gt;
&lt;TD class="r data"&gt;1&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TH class="r rowheader" scope="row"&gt;14&lt;/TH&gt;
&lt;TD class="r data"&gt;14&lt;/TD&gt;
&lt;TD class="r data"&gt;0&lt;/TD&gt;
&lt;TD class="l data"&gt;F&lt;/TD&gt;
&lt;TD class="l data"&gt;FEMALE&lt;/TD&gt;
&lt;TD class="r data"&gt;09/04/2007&lt;/TD&gt;
&lt;TD class="r data"&gt;09/04/2006&lt;/TD&gt;
&lt;TD class="r data"&gt;1&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TH class="r rowheader" scope="row"&gt;15&lt;/TH&gt;
&lt;TD class="r data"&gt;15&lt;/TD&gt;
&lt;TD class="r data"&gt;0&lt;/TD&gt;
&lt;TD class="l data"&gt;A&lt;/TD&gt;
&lt;TD class="l data"&gt;MALE&lt;/TD&gt;
&lt;TD class="r data"&gt;08/18/2014&lt;/TD&gt;
&lt;TD class="r data"&gt;08/18/2013&lt;/TD&gt;
&lt;TD class="r data"&gt;1&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TH class="r rowheader" scope="row"&gt;16&lt;/TH&gt;
&lt;TD class="r data"&gt;16&lt;/TD&gt;
&lt;TD class="r data"&gt;0&lt;/TD&gt;
&lt;TD class="l data"&gt;N&lt;/TD&gt;
&lt;TD class="l data"&gt;FEMALE&lt;/TD&gt;
&lt;TD class="r data"&gt;11/18/2013&lt;/TD&gt;
&lt;TD class="r data"&gt;11/18/2012&lt;/TD&gt;
&lt;TD class="r data"&gt;1&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TH class="r rowheader" scope="row"&gt;17&lt;/TH&gt;
&lt;TD class="r data"&gt;17&lt;/TD&gt;
&lt;TD class="r data"&gt;1&lt;/TD&gt;
&lt;TD class="l data"&gt;N&lt;/TD&gt;
&lt;TD class="l data"&gt;FEMALE&lt;/TD&gt;
&lt;TD class="r data"&gt;07/08/2014&lt;/TD&gt;
&lt;TD class="r data"&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD class="r data"&gt;1&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TH class="r rowheader" scope="row"&gt;18&lt;/TH&gt;
&lt;TD class="r data"&gt;18&lt;/TD&gt;
&lt;TD class="r data"&gt;0&lt;/TD&gt;
&lt;TD class="l data"&gt;N&lt;/TD&gt;
&lt;TD class="l data"&gt;MALE&lt;/TD&gt;
&lt;TD class="r data"&gt;03/11/2014&lt;/TD&gt;
&lt;TD class="r data"&gt;03/11/2013&lt;/TD&gt;
&lt;TD class="r data"&gt;1&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TH class="r rowheader" scope="row"&gt;19&lt;/TH&gt;
&lt;TD class="r data"&gt;19&lt;/TD&gt;
&lt;TD class="r data"&gt;0&lt;/TD&gt;
&lt;TD class="l data"&gt;N&lt;/TD&gt;
&lt;TD class="l data"&gt;MALE&lt;/TD&gt;
&lt;TD class="r data"&gt;09/17/2013&lt;/TD&gt;
&lt;TD class="r data"&gt;09/17/2012&lt;/TD&gt;
&lt;TD class="r data"&gt;1&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TH class="r rowheader" scope="row"&gt;20&lt;/TH&gt;
&lt;TD class="r data"&gt;20&lt;/TD&gt;
&lt;TD class="r data"&gt;0&lt;/TD&gt;
&lt;TD class="l data"&gt;N&lt;/TD&gt;
&lt;TD class="l data"&gt;MALE&lt;/TD&gt;
&lt;TD class="r data"&gt;03/13/2014&lt;/TD&gt;
&lt;TD class="r data"&gt;03/13/2013&lt;/TD&gt;
&lt;TD class="r data"&gt;1&lt;/TD&gt;
&lt;/TR&gt;
&lt;/TBODY&gt;
&lt;/TABLE&gt;
&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Thu, 11 Aug 2016 19:22:48 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/match-1-5-unique-case-controls/m-p/291052#M60292</guid>
      <dc:creator>jenim514</dc:creator>
      <dc:date>2016-08-11T19:22:48Z</dc:date>
    </item>
    <item>
      <title>Re: match 1:5 unique case controls...</title>
      <link>https://communities.sas.com/t5/SAS-Programming/match-1-5-unique-case-controls/m-p/291077#M60297</link>
      <description>&lt;P&gt;Show sample of Case data set and Control data set separately to help in visualizing your problem and get you a solution.&lt;/P&gt;&lt;P&gt;Your matching variables are Sex and service_entry_date. The second matching variable is little confusing.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Out of the sample data sets, derive an output(it may be a random) for a minimum of 2 Cases for &amp;nbsp;clarity&lt;/P&gt;</description>
      <pubDate>Thu, 11 Aug 2016 20:41:13 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/match-1-5-unique-case-controls/m-p/291077#M60297</guid>
      <dc:creator>KachiM</dc:creator>
      <dc:date>2016-08-11T20:41:13Z</dc:date>
    </item>
    <item>
      <title>Re: match 1:5 unique case controls...</title>
      <link>https://communities.sas.com/t5/SAS-Programming/match-1-5-unique-case-controls/m-p/291130#M60307</link>
      <description>&lt;P&gt;I would approach this a bit differently.&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;I'd keep the case and control datasets separate and apply the rand_num as you have done.&lt;/P&gt;
&lt;P&gt;Drop the SORT and RANK.&amp;nbsp; (BTW, RANK is working correctly.&amp;nbsp; SSN is a unique key and it restarts the ranking every time the by level changes.)&lt;/P&gt;
&lt;P&gt;Do the SQL, but change to two datasets and drop the rand_num part of the JOIN.&amp;nbsp; Include the case.ssn with the control.ssn in the output dataset and drop the other case variables.. This will get you ALL of the matches for each case, with duplication, so now your task is to de-duplicate.&amp;nbsp; Non-trivial, but doable.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;OR, you can use one of the man 1:N matching macros that people have already written.&amp;nbsp; Google search for&lt;/P&gt;
&lt;P&gt;sas matching macro&lt;/P&gt;
&lt;P&gt;and you will find a number.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Statistically, a 1:5 match isn't that much more informative than a 1:2 match.&amp;nbsp; Depending on your next steps, you could also use all fo the matches (1:1-1:x) and have a perfectly valid analysis.&amp;nbsp; The use of a limited number of matches is valuable if you have to do manual abstraction (e.g. extra labor), but if you are totally working with computer files, what's a few extra cycles to use them all.&lt;/P&gt;</description>
      <pubDate>Fri, 12 Aug 2016 03:56:14 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/match-1-5-unique-case-controls/m-p/291130#M60307</guid>
      <dc:creator>Doc_Duke</dc:creator>
      <dc:date>2016-08-12T03:56:14Z</dc:date>
    </item>
    <item>
      <title>Re: match 1:5 unique case controls...</title>
      <link>https://communities.sas.com/t5/SAS-Programming/match-1-5-unique-case-controls/m-p/291557#M60408</link>
      <description>&lt;P&gt;I modified the data slightly to create three matches (there was none in your sample data). Here is a hash solution:&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;data have;
infile datalines missover;
input Obs	SSN	study	service_branch :$1.	sex :$6.	
    (service_entry_date	service_entry_date_low) (:mmddyy10.);
format service_entry_date	service_entry_date_low yymmdd10.;
datalines;
1	1	0	A	MALE	05/10/2010	05/10/2005
2	2	1	A	MALE	11/20/2006
3	3	0	M	MALE	10/07/2011	10/07/2010
4	4	1	A	MALE	06/22/2010
5	5	0	M	MALE	10/23/2007	10/23/2006
6	6	0	M	MALE	07/08/2013	07/08/2012
7	7	0	F	FEMALE	01/16/2007	01/16/2006
8	8	1	A	MALE	08/03/2006
9	9	0	F	MALE	01/20/2009	01/21/2008
10	10	0	A	MALE	01/06/2009	01/07/2005
11	11	0	A	MALE	03/18/2009	03/18/2008
12	12	1	N	FEMALE	04/19/2007
13	13	0	F	MALE	02/18/2014	02/18/2013
14	14	0	F	FEMALE	09/04/2007	09/04/2005
15	15	0	A	MALE	08/18/2014	08/18/2013
16	16	0	N	FEMALE	11/18/2013	11/18/2005
17	17	1	N	FEMALE	07/08/2014
18	18	0	N	MALE	03/11/2014	03/11/2013
19	19	0	N	MALE	09/17/2013	09/17/2012
20	20	0	N	MALE	03/13/2014	03/13/2013
;

proc sql;
create table match as
select a.ssn as e_ssn, b.ssn as ne_ssn
from 
    have as a inner join 
    have as b
        on  a.service_entry_date between b.service_entry_date and b.service_entry_date_low and 
            a.service_branch=b.service_branch and
            a.sex=b.sex
where a.study and not b.study
order by ne_ssn, rand("uniform");
create table cases as
select ssn as e_ssn, 0 as count from have where study;
quit;

data mSet;
if _n_ = 1 then do;
	declare hash w(dataset:"cases");
	w.definekey("e_ssn");
	w.definedata("count");
	w.definedone();
	call missing(e_ssn, count);
	end;
assigned = 0;
do until(last.ne_ssn);
    set match; by ne_ssn;
    if not assigned then do;
        if w.find() = 0 then do;
            if count &amp;lt; 5 then do;
                count + 1;
                w.replace();
                output;
                assigned = 1;
                end;
            end;
        end;
    end;
keep e_ssn ne_ssn;
run;

proc print; run;&lt;/CODE&gt;&lt;/PRE&gt;</description>
      <pubDate>Sun, 14 Aug 2016 03:55:09 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/match-1-5-unique-case-controls/m-p/291557#M60408</guid>
      <dc:creator>PGStats</dc:creator>
      <dc:date>2016-08-14T03:55:09Z</dc:date>
    </item>
    <item>
      <title>Re: match 1:5 unique case controls...</title>
      <link>https://communities.sas.com/t5/SAS-Programming/match-1-5-unique-case-controls/m-p/292535#M60735</link>
      <description>&lt;P&gt;Thank you &lt;a href="https://communities.sas.com/t5/user/viewprofilepage/user-id/462"&gt;@PGStats﻿&lt;/a&gt;.&amp;nbsp; I ran the syntax you kindly prepared for me.&amp;nbsp; I am getting an error in the first sql section (see below).&amp;nbsp; I am currently using two tables (table A is cases, b is controls).&amp;nbsp; Both tables have SSN variable, so I'm not clear why I would get an error stating the order variable doesn' appear in the SELECT clause. &amp;nbsp; I apprecitate your help!!&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;82&amp;nbsp;&amp;nbsp; proc sql;&lt;BR /&gt;83&amp;nbsp;&amp;nbsp; create table match as&lt;BR /&gt;84&amp;nbsp;&amp;nbsp; select a.ssn as e_ssn, b.ssn as ne_ssn&lt;BR /&gt;85&amp;nbsp;&amp;nbsp; from&lt;BR /&gt;86&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; exp2.enroll_case as a inner join&lt;BR /&gt;87&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; exp2.control_nd as b&lt;BR /&gt;88&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; on&amp;nbsp; a.service_entry_date between b.service_entry_date and b.service_entry_date_low&lt;BR /&gt;88 ! and&lt;BR /&gt;89&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; a.service_branch=b.service_branch and&lt;BR /&gt;90&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; a.sex=b.sex&lt;BR /&gt;91&amp;nbsp;&amp;nbsp; where a.study and not b.study&lt;BR /&gt;92&amp;nbsp;&amp;nbsp; order by ne_ssn, rand("uniform");&lt;BR /&gt;&lt;STRONG&gt;NOTE: The query as specified involves ordering by an item that doesn't appear in its SELECT&lt;/STRONG&gt;&lt;BR /&gt;&lt;STRONG&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; clause.&lt;/STRONG&gt;&lt;BR /&gt;&lt;STRONG&gt;ERROR: Sort execution failure.&lt;/STRONG&gt;&lt;/P&gt;</description>
      <pubDate>Thu, 18 Aug 2016 19:24:31 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/match-1-5-unique-case-controls/m-p/292535#M60735</guid>
      <dc:creator>jenim514</dc:creator>
      <dc:date>2016-08-18T19:24:31Z</dc:date>
    </item>
    <item>
      <title>Re: match 1:5 unique case controls...</title>
      <link>https://communities.sas.com/t5/SAS-Programming/match-1-5-unique-case-controls/m-p/292544#M60740</link>
      <description>&lt;P&gt;Why would you need "&lt;SPAN&gt;where a.study and not b.study&lt;/SPAN&gt;" if you are using two datasets?&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;The message "The query as specified involves ordering by an item that doesn't appear in its SELECT&amp;nbsp;clause" is a Note, not an Error message. I also get that note.&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;The "&lt;STRONG&gt;Sort execution failure&lt;/STRONG&gt;" error message is new to me.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;You could use the following, without changing the rest :&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;proc sql;
create table match as
select a.ssn as e_ssn, b.ssn as ne_ssn, rand("uniform") as rnd
from 
    exp2.enroll_case as a inner join 
    exp2.control_nd as b
        on  a.service_entry_date between b.service_entry_date and b.service_entry_date_low and 
            a.service_branch=b.service_branch and
            a.sex=b.sex
order by ne_ssn, rnd;&lt;/CODE&gt;&lt;/PRE&gt;</description>
      <pubDate>Thu, 18 Aug 2016 19:45:23 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/match-1-5-unique-case-controls/m-p/292544#M60740</guid>
      <dc:creator>PGStats</dc:creator>
      <dc:date>2016-08-18T19:45:23Z</dc:date>
    </item>
    <item>
      <title>Re: match 1:5 unique case controls...</title>
      <link>https://communities.sas.com/t5/SAS-Programming/match-1-5-unique-case-controls/m-p/295968#M61918</link>
      <description>&lt;P&gt;&lt;a href="https://communities.sas.com/t5/user/viewprofilepage/user-id/462"&gt;@PGStats﻿&lt;/a&gt; Thank you so much for your help.&amp;nbsp; I was delayed in testing, but it worked great!&lt;/P&gt;</description>
      <pubDate>Thu, 01 Sep 2016 18:56:26 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/match-1-5-unique-case-controls/m-p/295968#M61918</guid>
      <dc:creator>jenim514</dc:creator>
      <dc:date>2016-09-01T18:56:26Z</dc:date>
    </item>
  </channel>
</rss>

