<?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: Find last child in SAS Programming</title>
    <link>https://communities.sas.com/t5/SAS-Programming/Find-last-child/m-p/113756#M23450</link>
    <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Art&lt;/P&gt;&lt;P&gt;Thanks a lot for your suggestion.&lt;/P&gt;&lt;P&gt;When I've created the sample data I was asking myself if it is a good idea to provide it in this sorted order (by date and "groups"). This is in reality of course not the case and the data for a specific group is not in sequence.&lt;/P&gt;&lt;P&gt;That's why your code doesn't work for me.&lt;/P&gt;&lt;P&gt;I'll provide at the end of this thread better sample data with some more explanation.&lt;/P&gt;&lt;P&gt;Thanks&lt;/P&gt;&lt;P&gt;Patrick&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
    <pubDate>Tue, 15 May 2012 10:42:38 GMT</pubDate>
    <dc:creator>Patrick</dc:creator>
    <dc:date>2012-05-15T10:42:38Z</dc:date>
    <item>
      <title>Find last child</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Find-last-child/m-p/113752#M23446</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hi all&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;I have this real life problem to solve which feels very much like a standard "out of the book" problem (something like a parts list). But I just don't manage to find an easy coding solution for it.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;What I have:&lt;/P&gt;&lt;P&gt;A couple of ID's which change over time.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;What I need:&lt;/P&gt;&lt;P&gt;Chain up these ID's and figure out which one is the latest one (the ID_TO in the chain with the latest date).&lt;/P&gt;&lt;P&gt;I then want to create a data set which can be used as input for a format (cntlin) to recode all ID's to the latest one (where needed)&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;ID's in chains don't overlap (=an ID is a member of exactly one chain).&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;I don't have a lot of data so simple code is more important than performance optimised one.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;data have;&lt;BR /&gt;&amp;nbsp; input date:date9. id_from id_to;&lt;BR /&gt;&amp;nbsp; format date date9.;&lt;BR /&gt;&amp;nbsp; datalines;&lt;BR /&gt;01may2012 001 002&lt;BR /&gt;02may2012 002 005&lt;BR /&gt;03may2012 005 002&lt;BR /&gt;01may2012 012 019&lt;/P&gt;&lt;P&gt;02may2012 019 012&lt;BR /&gt;03may2012 012 017&lt;BR /&gt;04may2012 017 016&lt;/P&gt;&lt;P&gt;;&lt;BR /&gt;run;&lt;/P&gt;&lt;P&gt;&lt;BR /&gt;Want:&lt;BR /&gt;start&amp;nbsp; label&lt;BR /&gt;001&amp;nbsp;&amp;nbsp; 002&lt;/P&gt;&lt;P&gt;005&amp;nbsp;&amp;nbsp; 002&lt;/P&gt;&lt;P&gt;017&amp;nbsp;&amp;nbsp; 016&lt;/P&gt;&lt;P&gt;019&amp;nbsp;&amp;nbsp; 016&lt;/P&gt;&lt;P&gt;012&amp;nbsp;&amp;nbsp; 016&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Any suggestions - some code or eventually just the necessary keywords to find some guidance for this assumed schoolbook problem - highly appreciated.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;For code: SAS9.3 version under Windows.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Thanks&lt;/P&gt;&lt;P&gt;Patrick&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Mon, 14 May 2012 12:51:38 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Find-last-child/m-p/113752#M23446</guid>
      <dc:creator>Patrick</dc:creator>
      <dc:date>2012-05-14T12:51:38Z</dc:date>
    </item>
    <item>
      <title>Re: Find last child</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Find-last-child/m-p/113753#M23447</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Here is one possibility:&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;data have;&lt;/P&gt;&lt;P&gt;&amp;nbsp; input date:date9. id_from id_to;&lt;/P&gt;&lt;P&gt;&amp;nbsp; format date date9.;&lt;/P&gt;&lt;P&gt;&amp;nbsp; datalines;&lt;/P&gt;&lt;P&gt;01may2012 001 002&lt;/P&gt;&lt;P&gt;02may2012 002 005&lt;/P&gt;&lt;P&gt;03may2012 005 002&lt;/P&gt;&lt;P&gt;01may2012 012 019&lt;/P&gt;&lt;P&gt;02may2012 019 012&lt;/P&gt;&lt;P&gt;03may2012 012 017&lt;/P&gt;&lt;P&gt;04may2012 017 016&lt;/P&gt;&lt;P&gt;;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;data temp;&lt;/P&gt;&lt;P&gt;&amp;nbsp; do until (last_record);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; set have end=last_record;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; last_id_to=lag(id_to);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if id_from ne last_id_to then group+1;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; output temp;&lt;/P&gt;&lt;P&gt;&amp;nbsp; end;&lt;/P&gt;&lt;P&gt;run;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;data want (keep=start label);&lt;/P&gt;&lt;P&gt;&amp;nbsp; do until (last.group);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; set temp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; by group;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if last.group then label=id_to;&lt;/P&gt;&lt;P&gt;&amp;nbsp; end;&lt;/P&gt;&lt;P&gt;&amp;nbsp; do until (last.group);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; set temp (rename=(id_from=start));&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; by group;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if start ne label then output;&lt;/P&gt;&lt;P&gt;&amp;nbsp; end;&lt;/P&gt;&lt;P&gt;run;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;proc sort data=want nodupkey;&lt;/P&gt;&lt;P&gt;&amp;nbsp; by start;&lt;/P&gt;&lt;P&gt;run;&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Mon, 14 May 2012 14:10:28 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Find-last-child/m-p/113753#M23447</guid>
      <dc:creator>art297</dc:creator>
      <dc:date>2012-05-14T14:10:28Z</dc:date>
    </item>
    <item>
      <title>Re: Find last child</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Find-last-child/m-p/113754#M23448</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Sounds like you're playing around with what's called a 'slowly changing dimension'&amp;nbsp; or a 'Type 2' dimension from a BI perspective.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Some words if you felt like googling, b/c I'm sure Art's solution will work &lt;img id="smileyhappy" class="emoticon emoticon-smileyhappy" src="https://communities.sas.com/i/smilies/16x16_smiley-happy.png" alt="Smiley Happy" title="Smiley Happy" /&gt;.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Here's another solution that doesn't use loops.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;data have;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; input date:date9. id_from id_to;&lt;/P&gt;&lt;P&gt;&amp;nbsp; format date date9.;&lt;/P&gt;&lt;P&gt;&amp;nbsp; datalines;&lt;/P&gt;&lt;P&gt;01may2012 001 002&lt;/P&gt;&lt;P&gt;02may2012 002 005&lt;/P&gt;&lt;P&gt;03may2012 005 002&lt;/P&gt;&lt;P&gt;01may2012 012 019&lt;/P&gt;&lt;P&gt;02may2012 019 012&lt;/P&gt;&lt;P&gt;03may2012 012 017&lt;/P&gt;&lt;P&gt;04may2012 017 016&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;*Identify Chains;&lt;/P&gt;&lt;P&gt;data id_chains;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; set have;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; retain chain 0;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if id_from ne lag(id_to) then chain+1;&lt;/P&gt;&lt;P&gt;run;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;*Get last ID per chain;&lt;/P&gt;&lt;P&gt;proc sort data=id_chains; by chain date; run;&lt;/P&gt;&lt;P&gt;proc sort data=id_chains nodupkey out=latest_id (keep= chain id_to); by chain; run;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;*Merge in the latest ID;&lt;/P&gt;&lt;P&gt;data want;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; merge id_chains latest_id (rename= id_to=latest_id);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; by chain;&lt;/P&gt;&lt;P&gt;run; &lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Mon, 14 May 2012 22:22:57 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Find-last-child/m-p/113754#M23448</guid>
      <dc:creator>Reeza</dc:creator>
      <dc:date>2012-05-14T22:22:57Z</dc:date>
    </item>
    <item>
      <title>Re: Find last child</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Find-last-child/m-p/113755#M23449</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hi , Patrick.&lt;/P&gt;&lt;P&gt;If I understand what you mean .&lt;/P&gt;&lt;P&gt;Check out if it is what you want.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;PRE&gt;data have;
&amp;nbsp; input date:date9. id_from $ id_to $;
&amp;nbsp; format date date9.;
&amp;nbsp; datalines;
01may2012 001 002
02may2012 002 005
03may2012 005 002
01may2012 012 019
02may2012 019 012
03may2012 012 017
04may2012 017 016
;
run;

data want(drop=_:);
 if _n_ eq 1 then do;
&amp;nbsp; if 0 then set have;
&amp;nbsp; declare hash ha();
&amp;nbsp;&amp;nbsp; ha.definekey('id_from');
&amp;nbsp;&amp;nbsp; ha.definedone();
 end;
set have;
if ha.check() ne 0 then do;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ha.add();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; do i=_n_+1 to nobs ;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; set have(keep=id_from id_to rename=(id_from=_id_from id_to=_id_to)) point=i nobs=nobs;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if id_to eq _id_from then id_to=_id_to;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else leave;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; end;
 output;
 id_from=id_to;ha.replace();
end;
run;
&lt;/PRE&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;Ksharp&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Tue, 15 May 2012 06:45:43 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Find-last-child/m-p/113755#M23449</guid>
      <dc:creator>Ksharp</dc:creator>
      <dc:date>2012-05-15T06:45:43Z</dc:date>
    </item>
    <item>
      <title>Re: Find last child</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Find-last-child/m-p/113756#M23450</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Art&lt;/P&gt;&lt;P&gt;Thanks a lot for your suggestion.&lt;/P&gt;&lt;P&gt;When I've created the sample data I was asking myself if it is a good idea to provide it in this sorted order (by date and "groups"). This is in reality of course not the case and the data for a specific group is not in sequence.&lt;/P&gt;&lt;P&gt;That's why your code doesn't work for me.&lt;/P&gt;&lt;P&gt;I'll provide at the end of this thread better sample data with some more explanation.&lt;/P&gt;&lt;P&gt;Thanks&lt;/P&gt;&lt;P&gt;Patrick&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Tue, 15 May 2012 10:42:38 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Find-last-child/m-p/113756#M23450</guid>
      <dc:creator>Patrick</dc:creator>
      <dc:date>2012-05-15T10:42:38Z</dc:date>
    </item>
    <item>
      <title>Re: Find last child</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Find-last-child/m-p/113757#M23451</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hi Reeza&lt;/P&gt;&lt;P&gt;Thanks for your code. It has the same basic issue than Art's (see comment there).&lt;/P&gt;&lt;P&gt;I believe there is also something else not working as expected as when I run it on my laptop it gives me as latest_ID '2' and '19' - but it should be '2' and '16'.&lt;/P&gt;&lt;P&gt;Thanks&lt;/P&gt;&lt;P&gt;Patrick&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Tue, 15 May 2012 10:46:12 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Find-last-child/m-p/113757#M23451</guid>
      <dc:creator>Patrick</dc:creator>
      <dc:date>2012-05-15T10:46:12Z</dc:date>
    </item>
    <item>
      <title>Re: Find last child</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Find-last-child/m-p/113758#M23452</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hi Ksharp&lt;/P&gt;&lt;P&gt;I would have been disappointed if you wouldn't have come up with a hash approach :-))&lt;/P&gt;&lt;P&gt;Your code works with the sample data but also falls short when I feed it with a bit a more elaborate sample.&lt;/P&gt;&lt;P&gt;I haven't really analysed your code good enough to tell why this happens.&lt;/P&gt;&lt;P&gt;I'll add better sample data and some more explanation right now.&lt;/P&gt;&lt;P&gt;Thanks&lt;/P&gt;&lt;P&gt;Patrick&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Tue, 15 May 2012 10:49:41 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Find-last-child/m-p/113758#M23452</guid>
      <dc:creator>Patrick</dc:creator>
      <dc:date>2012-05-15T10:49:41Z</dc:date>
    </item>
    <item>
      <title>Re: Find last child</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Find-last-child/m-p/113759#M23453</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Below some better sample data (which broke all of the above solutions) together with the expected (wanted) result.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;What this is about in real life:&lt;/P&gt;&lt;P&gt;Product codes which change during promotion periods - and I don't have some parent product code I can trust due to data quality issues. So what I need to do is to "chain-up" all these product codes and then create my own parent code (using the last code in the chain). I know that this means the parent code will change over time and that's why I don't want to actually store a parent code but use a format (...and the most current code will then link to the most current entries in ref tables - that's why I must use a "dynamic" parent code).&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Sample data:&lt;BR /&gt;01may2012 001 022&lt;BR /&gt;01may2012 032 019&lt;BR /&gt;02may2012 019 032&lt;BR /&gt;02may2012 022 005&lt;BR /&gt;03may2012 005 022&lt;BR /&gt;03may2012 032 017&lt;BR /&gt;04may2012 017 016&lt;/P&gt;&lt;P&gt;&lt;BR /&gt;Resulting chains:&lt;BR /&gt;001/022/005/022&lt;BR /&gt;032/019/032/017/016&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Wanted DS:&lt;BR /&gt;Start Label&lt;BR /&gt;001&amp;nbsp;&amp;nbsp; 022&lt;BR /&gt;005&amp;nbsp;&amp;nbsp; 022&lt;BR /&gt;032&amp;nbsp;&amp;nbsp; 016&lt;BR /&gt;019&amp;nbsp;&amp;nbsp; 016&lt;BR /&gt;017&amp;nbsp;&amp;nbsp; 016&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Tue, 15 May 2012 11:06:13 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Find-last-child/m-p/113759#M23453</guid>
      <dc:creator>Patrick</dc:creator>
      <dc:date>2012-05-15T11:06:13Z</dc:date>
    </item>
    <item>
      <title>Re: Find last child</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Find-last-child/m-p/113760#M23454</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Patrick,&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;That changes the complexity of the problem significantly.&amp;nbsp; We had a similar thread sometime back both here and on SAS-L.&amp;nbsp; I can't find the one here, but take a look at:&lt;/P&gt;&lt;P&gt;&lt;A href="http://www.listserv.uga.edu/cgi-bin/wa?A2=ind1109B&amp;amp;L=sas-l&amp;amp;P=R7538&amp;amp;D=0&amp;amp;H=0&amp;amp;O=D&amp;amp;T=1" title="http://www.listserv.uga.edu/cgi-bin/wa?A2=ind1109B&amp;amp;L=sas-l&amp;amp;P=R7538&amp;amp;D=0&amp;amp;H=0&amp;amp;O=D&amp;amp;T=1"&gt;SAS-L archives -- September 2011, week 2 (#94)&amp;lt;/title&amp;gt;&amp;lt;style type="text/css"&amp;gt;&amp;lt;!--BODY { font-family: "Comic Sans MS",arial, helvetica, sans-serif; font-size: 14px; color: black; background-color: white; }TD, TH, FONT, .BOD { font-family: "Comic Sans MS", arial, helvetica, sans-serif; font-size: 14px; margin-left: 0px; margin-right: 0px; color: black; }SUP { font-family: courier,monospace; font-size: 12px; text-decoration: none; }KBD {font-family: courier,monospace;}PRE {font-family: courier,monospace;} .SMALL {font-size: 12px} .SMALLER {font-size: 10px} .LARGE {font-size: 16px} .LARGER {font-size: 18px} .FOOT {font-size: 12px; color: gray } .BLOCK { font-size: 12px; color: #555555; text-align: justify; } .FIXED { font-family: courier,monospaced; font-size:12pt }STRONG {font-weight: bold }EM { font-style: italic; }A:LINK { text-decoration: none; color: #0000FF; }A:VISITED { text-decoration: none; color: #0000FF; }A:ACTIVE { text-decoration: none; color: #0000FF; }A:HOVER { text-decoration: none; color: #ad080a; }H1 { font-size: 22px; }H2 { font-size: 20px; }H3 { font-size: 18px; }--&amp;gt;&amp;lt;/style&amp;gt;&amp;lt;!-- This is the top part for sub pages (topsub.html) 12/10/99 16:05 --&amp;gt;&amp;lt;head&amp;gt;&amp;lt;title&amp;gt;LISTSERV at the University of Georgia&lt;/A&gt;&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Tue, 15 May 2012 12:52:16 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Find-last-child/m-p/113760#M23454</guid>
      <dc:creator>art297</dc:creator>
      <dc:date>2012-05-15T12:52:16Z</dc:date>
    </item>
    <item>
      <title>Re: Find last child</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Find-last-child/m-p/113761#M23455</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;The problem I found is that to find a complete chain you must pass through the entire dataset once. So if there are multiple chains it requires multiple passes. My solution is a macro that recursively passes through the dataset until all chains are found. Basically, each pass through the dataset 'have' creates 2 datasets: 1) the obs belonging to the current chain are output to dataset 'chain', 2) all other obs are output to 'have', so 'have' reduces in size through each pass. The recursion is controlled by the value of the variable _have_left that contains the number of obs that are output to 'have' and still require further processing. When _have_left = 0, the recursion stops.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;%macro recurse;&lt;BR /&gt;%do %until ( &amp;amp;have_left eq 0 );&lt;BR /&gt;&amp;nbsp;&amp;nbsp; data have (keep=id_from id_to)&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; chain (keep=start label);&lt;BR /&gt;&amp;nbsp;&amp;nbsp; set have end=eof;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; retain _1st_rec 1 _last_id_to;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; if _1st_rec or id_from = _last_id_to then do;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _1st_rec = 0;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _last_id_to = id_to;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; start = id_from;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; label = id_to;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; output chain;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; end;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; else do;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _have_left + 1;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; output have;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; end;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; if eof then do;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; call symput( 'chain_end', _last_id_to ); * final product at end of chain;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; call symput( 'have_left', _have_left ); * number of records still to process;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; end;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; run;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; data chain;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; set chain;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; label = "&amp;amp;chain_end"; * set to the final product;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; if start = label then delete; &lt;BR /&gt;&amp;nbsp;&amp;nbsp; run;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; proc append base=chain_fmt data=chain;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; run;&lt;BR /&gt;%end;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;* remove dupe pairs like 032,016 from sample;&lt;BR /&gt;proc sort data=chain_fmt nodup;&lt;BR /&gt;by _all_;&lt;BR /&gt;run;&lt;BR /&gt;%mend;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;%recurse;&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Tue, 15 May 2012 13:30:02 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Find-last-child/m-p/113761#M23455</guid>
      <dc:creator>FloydNevseta</dc:creator>
      <dc:date>2012-05-15T13:30:02Z</dc:date>
    </item>
    <item>
      <title>Re: Find last child</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Find-last-child/m-p/113762#M23456</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hi. Patrick.&lt;/P&gt;&lt;P&gt;I might understand what you mean.&lt;/P&gt;&lt;P&gt;You want to chain them up by time series order, and the obs are stored by time series order.&lt;/P&gt;&lt;P&gt;But there is a scenario I want know, if there are multi id_from at the following obs , what you are going to do ?&lt;/P&gt;&lt;P&gt;Sample data:&lt;BR /&gt;01may2012 001 022&lt;BR /&gt;01may2012 032 019&lt;BR /&gt;02may2012 019 032&lt;BR /&gt;02may2012 022 005&lt;BR /&gt;03may2012 005 022&lt;BR /&gt;03may2012 032 017&lt;BR /&gt;04may2012 &lt;STRONG&gt;032&lt;/STRONG&gt; 016&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;I only take the first appeared obs.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;PRE&gt;
data have;
&amp;nbsp; input date:date9. id_from $ id_to $;
&amp;nbsp; format date date9.;
&amp;nbsp; datalines;
01may2012 001 022
01may2012 032 019
02may2012 019 032
02may2012 022 005
03may2012 005 022
03may2012 032 017
04may2012 017 016
;
run;

data want(keep=start label);
 if _n_ eq 1 then do;
&amp;nbsp; length id_from $ 8;*if 0 then set have;
&amp;nbsp; declare hash ha(ordered:'y');
&amp;nbsp;&amp;nbsp; ha.definekey('id_from');
&amp;nbsp;&amp;nbsp; ha.definedone();
end;

set have;
&amp;nbsp; declare hash ha1(ordered:'y');
&amp;nbsp; declare hiter hi1('ha1');
&amp;nbsp;&amp;nbsp; ha1.definekey('id_from');
&amp;nbsp;&amp;nbsp; ha1.definedata('id_from');
&amp;nbsp;&amp;nbsp; ha1.definedone();

if ha.check() ne 0 then do;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ha.replace();ha1.replace();id_from=id_to;ha.replace();ha1.replace();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; do i=_n_+1 to nobs ;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; set have(keep=id_from id_to rename=(id_from=_id_from id_to=_id_to)) point=i nobs=nobs;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if id_to eq _id_from then do;id_from=_id_to;ha.replace();ha1.replace();id_to=_id_to;end;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; end;
 label=id_to;
 do while(hi1.next()=0);
&amp;nbsp; if id_from ne id_to then do;start=id_from;output;end;
 end;
end;
run;


&lt;/PRE&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Ksharp&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Tue, 15 May 2012 13:58:26 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Find-last-child/m-p/113762#M23456</guid>
      <dc:creator>Ksharp</dc:creator>
      <dc:date>2012-05-15T13:58:26Z</dc:date>
    </item>
    <item>
      <title>Re: Find last child</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Find-last-child/m-p/113763#M23457</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;SAS_Bigot,&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;I think that you're right ... you need two passes through the data.&amp;nbsp; But it shouldn't be that complicated.&amp;nbsp; Here's a simpler way.&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 (rename=(id_from=start id_to=label)) nobs=_nobs_;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; if _n_ &amp;lt; _nobs_ then do _i_=_n_+1 to _nobs_;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; set have point=_i_;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if id_from=label then label=id_to;&lt;/P&gt;&lt;P&gt;&amp;nbsp; end;&lt;/P&gt;&lt;P&gt;&amp;nbsp; if start ne end;&lt;/P&gt;&lt;P&gt;&amp;nbsp; retain fmtname '$id_to';&lt;/P&gt;&lt;P&gt;run;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;** if needed;&lt;/P&gt;&lt;P&gt;proc sort data=want NODUPKEY;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; by start end;&lt;/P&gt;&lt;P&gt;run;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;It still takes some processing time, and it assumes that the ID changes should be applied in the order that they appear within the HAVE data set.&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Tue, 15 May 2012 13:58:27 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Find-last-child/m-p/113763#M23457</guid>
      <dc:creator>Astounding</dc:creator>
      <dc:date>2012-05-15T13:58:27Z</dc:date>
    </item>
    <item>
      <title>Re: Find last child</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Find-last-child/m-p/113764#M23458</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;I like it. It's very compact and easy to understand. I made a small correction to get it to work: start ne label.&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Tue, 15 May 2012 16:05:13 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Find-last-child/m-p/113764#M23458</guid>
      <dc:creator>FloydNevseta</dc:creator>
      <dc:date>2012-05-15T16:05:13Z</dc:date>
    </item>
    <item>
      <title>Re: Find last child</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Find-last-child/m-p/113765#M23459</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Ooops.&amp;nbsp; That's what happens when you don't test your code.&amp;nbsp; Thanks for catching it.&amp;nbsp; I guess that applies to the PROC SORT as well.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;I have a minor concern ... how long will it take to run.&amp;nbsp; The number of SET statement executions is proportional to the square of the number of observations.&amp;nbsp; Some jobs were meant to run overnight.&amp;nbsp;&amp;nbsp; :smileylaugh:&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Tue, 15 May 2012 17:57:20 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Find-last-child/m-p/113765#M23459</guid>
      <dc:creator>Astounding</dc:creator>
      <dc:date>2012-05-15T17:57:20Z</dc:date>
    </item>
    <item>
      <title>Re: Find last child</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Find-last-child/m-p/113766#M23460</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Astounding,&lt;/P&gt;&lt;P&gt;I ran your code:&lt;/P&gt;&lt;P&gt;data have;&lt;BR /&gt;&amp;nbsp; input date:date9. id_from $ id_to $;&lt;BR /&gt;&amp;nbsp; format date date9.;&lt;BR /&gt;&amp;nbsp; datalines;&lt;BR /&gt;01may2012 001 022&lt;BR /&gt;01may2012 032 019&lt;BR /&gt;02may2012 019 032&lt;BR /&gt;02may2012 022 005&lt;BR /&gt;03may2012 005 022&lt;BR /&gt;03may2012 032 017&lt;BR /&gt;04may2012 017 016&lt;BR /&gt;;&lt;BR /&gt;run;&lt;BR /&gt;data want(keep=start label);&lt;BR /&gt;&amp;nbsp;&amp;nbsp; set have (rename=(id_from=start id_to=label)) nobs=_nobs_;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; if _n_ &amp;lt; _nobs_ then do _i_=_n_+1 to _nobs_;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; set have point=_i_;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if id_from=label then label=id_to;&lt;BR /&gt;&amp;nbsp; end;&lt;BR /&gt;&amp;nbsp; if start ne label;&lt;BR /&gt;&amp;nbsp; retain fmtname '$id_to';&lt;BR /&gt;run;&lt;/P&gt;&lt;P&gt;proc sort data=want NODUPKEY;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; by start label;&lt;BR /&gt;run;&lt;/P&gt;&lt;P&gt;&lt;BR /&gt;&lt;SPAN style="color: #ff0000; font-size: 12pt;"&gt;below is the log file:&lt;/SPAN&gt;&lt;BR /&gt;2767&amp;nbsp; data have;&lt;BR /&gt;2768&amp;nbsp;&amp;nbsp;&amp;nbsp; input date:date9. id_from $ id_to $;&lt;BR /&gt;2769&amp;nbsp;&amp;nbsp;&amp;nbsp; format date date9.;&lt;BR /&gt;2770&amp;nbsp;&amp;nbsp;&amp;nbsp; datalines;&lt;/P&gt;&lt;P&gt;NOTE: The data set WORK.HAVE has 7 observations and 3 variables.&lt;BR /&gt;NOTE: DATA statement used (Total process time):&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; real time&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0.00 seconds&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cpu time&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0.00 seconds&lt;/P&gt;&lt;P&gt;&lt;BR /&gt;2778&amp;nbsp; ;&lt;BR /&gt;2779&amp;nbsp; run;&lt;BR /&gt;2780&amp;nbsp; data want(keep=start label);&lt;BR /&gt;2781&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; set have (rename=(id_from=start id_to=label)) nobs=_nobs_;&lt;BR /&gt;2782&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if _n_ &amp;lt; _nobs_ then do _i_=_n_+1 to _nobs_;&lt;BR /&gt;2783&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; set have point=_i_;&lt;BR /&gt;2784&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if id_from=label then label=id_to;&lt;BR /&gt;2785&amp;nbsp;&amp;nbsp;&amp;nbsp; end;&lt;BR /&gt;2786&amp;nbsp;&amp;nbsp;&amp;nbsp; if start ne label;&lt;BR /&gt;2787&amp;nbsp;&amp;nbsp;&amp;nbsp; retain fmtname '$id_to';&lt;BR /&gt;2788&amp;nbsp; run;&lt;/P&gt;&lt;P&gt;NOTE: There were 7 observations read from the data set WORK.HAVE.&lt;BR /&gt;NOTE: The data set WORK.WANT has 6 observations and 2 variables.&lt;BR /&gt;NOTE: DATA statement used (Total process time):&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; real time&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0.00 seconds&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cpu time&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0.00 seconds&lt;/P&gt;&lt;P&gt;&lt;BR /&gt;2789&lt;BR /&gt;2790&amp;nbsp;&amp;nbsp; proc sort data=want NODUPKEY;&lt;BR /&gt;2791&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; by start label;&lt;BR /&gt;2792&amp;nbsp; run;&lt;/P&gt;&lt;P&gt;NOTE: There were 6 observations read from the data set WORK.WANT.&lt;BR /&gt;NOTE: 1 observations with duplicate key values were deleted.&lt;BR /&gt;NOTE: The data set WORK.WANT has 5 observations and 2 variables.&lt;BR /&gt;NOTE: PROCEDURE SORT used (Total process time):&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; real time&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0.00 seconds&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cpu time&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0.00 seconds&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Tue, 15 May 2012 18:23:38 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Find-last-child/m-p/113766#M23460</guid>
      <dc:creator>Linlin</dc:creator>
      <dc:date>2012-05-15T18:23:38Z</dc:date>
    </item>
    <item>
      <title>Re: Find last child</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Find-last-child/m-p/113767#M23461</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Thanks.&amp;nbsp; It looks like those were the only corrections needed.&amp;nbsp; Double-checking the original post, it's a relief to see that there won't be a tremendous amount of data to run through.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;The hashing solution is intriguing.&amp;nbsp; It seems like this ought to be a good problem for hashing.&amp;nbsp; My hashing skills aren't up to the task, however.&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Tue, 15 May 2012 18:33:27 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Find-last-child/m-p/113767#M23461</guid>
      <dc:creator>Astounding</dc:creator>
      <dc:date>2012-05-15T18:33:27Z</dc:date>
    </item>
    <item>
      <title>Re: Find last child</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Find-last-child/m-p/113768#M23462</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;If the OP wants a truely &lt;EM&gt;dynamic&lt;/EM&gt; solution, here is one wrapping Astonding's excellent solution in a&amp;nbsp; function, so that the latest descendant is found on-the-fly.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P style="font-family: Consolas; font-size: 90%; line-height: 1.1;"&gt;&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="color: #000080;"&gt;&lt;STRONG&gt;data&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN&gt; one;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="color: #0000ff;"&gt;input&lt;/SPAN&gt;&lt;SPAN&gt; date :&lt;/SPAN&gt;&lt;SPAN style="color: #008080;"&gt;date11.&lt;/SPAN&gt;&lt;SPAN&gt; (parent child) (:&lt;/SPAN&gt;&lt;SPAN style="color: #008080;"&gt;$3.&lt;/SPAN&gt;&lt;SPAN&gt;);&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="color: #0000ff;"&gt;cards&lt;/SPAN&gt;&lt;SPAN&gt;;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; 01may2012 001 022&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; 01may2012 032 019&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; 02may2012 019 032&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; 02may2012 022 005&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; 03may2012 005 022&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; 03may2012 032 017&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; 04may2012 017 016&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; ;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="color: #000080;"&gt;&lt;STRONG&gt;run&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN&gt;;&lt;/SPAN&gt;&lt;BR /&gt; &lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="color: #008000;"&gt;/* for the given ancestor, return the latest descendant. &lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="color: #008000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; borrowed from Astounding in the thread 35133 "Find last child."&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="color: #008000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; assumes that data are chronologically ordered. */&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="color: #000080;"&gt;&lt;STRONG&gt;%macro&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN&gt; &lt;/SPAN&gt;&lt;STRONG&gt;&lt;EM&gt;&lt;SPAN&gt;LD&lt;/SPAN&gt;&lt;/EM&gt;&lt;/STRONG&gt;&lt;SPAN&gt;;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="color: #0000ff;"&gt;%global&lt;/SPAN&gt;&lt;SPAN&gt; ancestor LD;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="color: #0000ff;"&gt;%let&lt;/SPAN&gt;&lt;SPAN&gt; ancestor = &lt;/SPAN&gt;&lt;SPAN style="color: #0000ff;"&gt;%sysfunc&lt;/SPAN&gt;&lt;SPAN&gt;(dequote(&amp;amp;ancestor));&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; data _LD;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; do until (start = &lt;/SPAN&gt;&lt;SPAN style="color: #800080;"&gt;"&amp;amp;ancestor"&lt;/SPAN&gt;&lt;SPAN&gt;);&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; set one(rename=(parent=start child=label)) nobs=nobs;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; i + &lt;/SPAN&gt;&lt;SPAN style="color: #008080;"&gt;&lt;STRONG&gt;1&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN&gt;;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; end;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; do j = i + &lt;/SPAN&gt;&lt;SPAN style="color: #008080;"&gt;&lt;STRONG&gt;1&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN&gt; to nobs;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; set one point=j;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if parent = label then label = child;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; end;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; output;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; run;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; data _LD;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; set _LD end=end;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if end then call symputx(&lt;/SPAN&gt;&lt;SPAN style="color: #800080;"&gt;"LD"&lt;/SPAN&gt;&lt;SPAN&gt;, label, &lt;/SPAN&gt;&lt;SPAN style="color: #800080;"&gt;"global"&lt;/SPAN&gt;&lt;SPAN&gt;);&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; run;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="color: #000080;"&gt;&lt;STRONG&gt;%mend&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN&gt; LD;&lt;/SPAN&gt;&lt;BR /&gt; &lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="color: #000080;"&gt;&lt;STRONG&gt;proc&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN&gt; &lt;/SPAN&gt;&lt;SPAN style="color: #000080;"&gt;&lt;STRONG&gt;fcmp&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN&gt; outlib=work.func.LD;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; function LD(ancestor $) $&lt;/SPAN&gt;&lt;SPAN style="color: #008080;"&gt;&lt;STRONG&gt;3&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN&gt;;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="color: #0000ff;"&gt;length&lt;/SPAN&gt;&lt;SPAN&gt; LD $&lt;/SPAN&gt;&lt;SPAN style="color: #008080;"&gt;&lt;STRONG&gt;3&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN&gt;;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; rc = run_macro(&lt;/SPAN&gt;&lt;SPAN style="color: #800080;"&gt;"LD"&lt;/SPAN&gt;&lt;SPAN&gt;, ancestor, LD);&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return(LD); &lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; endsub;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="color: #000080;"&gt;&lt;STRONG&gt;quit&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN&gt;;&lt;/SPAN&gt;&lt;BR /&gt; &lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="color: #0000ff;"&gt;%let&lt;/SPAN&gt;&lt;SPAN&gt; cmplib = &lt;/SPAN&gt;&lt;SPAN style="color: #0000ff;"&gt;%sysfunc&lt;/SPAN&gt;&lt;SPAN&gt;(getoption(cmplib));&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="color: #0000ff;"&gt;options&lt;/SPAN&gt;&lt;SPAN&gt; &lt;/SPAN&gt;&lt;SPAN style="color: #0000ff;"&gt;cmplib&lt;/SPAN&gt;&lt;SPAN&gt; = (work.func &amp;amp;cmplib);&lt;/SPAN&gt;&lt;BR /&gt; &lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="color: #008000;"&gt;/* check */&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="color: #000080;"&gt;&lt;STRONG&gt;data&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN&gt; &lt;/SPAN&gt;&lt;SPAN style="color: #0000ff;"&gt;_null_&lt;/SPAN&gt;&lt;SPAN&gt;;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="color: #0000ff;"&gt;do&lt;/SPAN&gt;&lt;SPAN&gt; ancestor = &lt;/SPAN&gt;&lt;SPAN style="color: #800080;"&gt;"001"&lt;/SPAN&gt;&lt;SPAN&gt;, &lt;/SPAN&gt;&lt;SPAN style="color: #800080;"&gt;"032"&lt;/SPAN&gt;&lt;SPAN&gt;, &lt;/SPAN&gt;&lt;SPAN style="color: #800080;"&gt;"019"&lt;/SPAN&gt;&lt;SPAN&gt;, &lt;/SPAN&gt;&lt;SPAN style="color: #800080;"&gt;"022"&lt;/SPAN&gt;&lt;SPAN&gt;, &lt;/SPAN&gt;&lt;SPAN style="color: #800080;"&gt;"005"&lt;/SPAN&gt;&lt;SPAN&gt;, &lt;/SPAN&gt;&lt;SPAN style="color: #800080;"&gt;"017"&lt;/SPAN&gt;&lt;SPAN&gt;;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; latest_descendant = LD(ancestor);&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="color: #0000ff;"&gt;put&lt;/SPAN&gt;&lt;SPAN&gt; ancestor &lt;/SPAN&gt;&lt;SPAN style="color: #800080;"&gt;"--&amp;gt; "&lt;/SPAN&gt;&lt;SPAN&gt; latest_descendant; &lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="color: #0000ff;"&gt;end&lt;/SPAN&gt;&lt;SPAN&gt;;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="color: #000080;"&gt;&lt;STRONG&gt;run&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN&gt;;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="color: #008000;"&gt;/* on log&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="color: #008000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 001 --&amp;gt; 022&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="color: #008000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 032 --&amp;gt; 016&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="color: #008000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 019 --&amp;gt; 016&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="color: #008000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 022 --&amp;gt; 022&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="color: #008000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 005 --&amp;gt; 022&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="color: #008000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 017 --&amp;gt; 016&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="color: #008000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; */&lt;/SPAN&gt;&lt;BR /&gt; &lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="color: #0000ff;"&gt;options&lt;/SPAN&gt;&lt;SPAN&gt; &lt;/SPAN&gt;&lt;SPAN style="color: #0000ff;"&gt;cmplib&lt;/SPAN&gt;&lt;SPAN&gt; = (&amp;amp;cmplib);&lt;/SPAN&gt;&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Tue, 15 May 2012 18:51:38 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Find-last-child/m-p/113768#M23462</guid>
      <dc:creator>chang_y_chung_hotmail_com</dc:creator>
      <dc:date>2012-05-15T18:51:38Z</dc:date>
    </item>
    <item>
      <title>Re: Find last child</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Find-last-child/m-p/113769#M23463</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hi all&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Thanks a lot for all your good solutions and sorry for replying only now.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;I've tested them all - throwing some more data at it - and everything after Astounding's code with the little fix from Linlin worked.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;As said in the original post the volumes I'm dealing with are low (couple of thousand rows) and simplicity of code is more important than performance.&lt;/P&gt;&lt;P&gt;That's why I'm going with Astounding's solution. And in case there should be performance issues then Ksharp's second take on the problem will be the remedy.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;To answer your question Ksharp "But there is a scenario I want know, if there are multi id_from at the following obs , what you are going to do ?".&lt;/P&gt;&lt;P&gt;That can't happen. Per chain there will be maximum of one change per day, and an ID can't be member of more than one chain.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;chang_y_chung&lt;/P&gt;&lt;P&gt;I think I understand what you had in mind but it takes things further than I need it for my real life situation. Thanks anyway for the idea.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Art&lt;/P&gt;&lt;P&gt;Thanks for the link. I had a look at it and sure could have taken some inspiration from there. Nicely for me people gave me here in this forum already a fully working and simple solution - exactly what I needed.&lt;/P&gt;&lt;P&gt;(for some reason it doesn't let me mark your answer as "helpful" - sorry about that).&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Thanks again to everybody!&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Patrick&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Sun, 20 May 2012 01:15:14 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Find-last-child/m-p/113769#M23463</guid>
      <dc:creator>Patrick</dc:creator>
      <dc:date>2012-05-20T01:15:14Z</dc:date>
    </item>
    <item>
      <title>Re: Find last child</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Find-last-child/m-p/113770#M23464</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hellow thank you,&amp;nbsp; accept me&amp;nbsp; in your network I just have read it your opinion I am agree with you with your solutions, but I have not sample enougth. That´s it is all.&lt;/P&gt;&lt;P&gt;Please can you help me because I have a problem about configure system computer , monitor, excel SQL, therefore I am working all the time use it , proc glm etc.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;My regards I understood other meaning.&amp;nbsp; bye&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Thu, 24 May 2012 15:15:22 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Find-last-child/m-p/113770#M23464</guid>
      <dc:creator>raulbq_telefonica_net</dc:creator>
      <dc:date>2012-05-24T15:15:22Z</dc:date>
    </item>
    <item>
      <title>Re: Find last child</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Find-last-child/m-p/113771#M23465</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hi Patrick,&lt;/P&gt;&lt;P&gt;You may also try the following data steps using hash object.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Zafer&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;data have;&lt;/P&gt;&lt;P&gt;&amp;nbsp; input date:date9. id_from $ id_to $;&lt;/P&gt;&lt;P&gt;&amp;nbsp; format date date9.;&lt;/P&gt;&lt;P&gt;&amp;nbsp; datalines;&lt;/P&gt;&lt;P&gt;01may2012 001 022&lt;/P&gt;&lt;P&gt;01may2012 032 019&lt;/P&gt;&lt;P&gt;02may2012 019 032&lt;/P&gt;&lt;P&gt;02may2012 022 005&lt;/P&gt;&lt;P&gt;03may2012 005 022&lt;/P&gt;&lt;P&gt;03may2012 032 017&lt;/P&gt;&lt;P&gt;04may2012 017 016&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;data _null_;&lt;/P&gt;&lt;P&gt;&amp;nbsp; length l $4000 id $3;&lt;/P&gt;&lt;P&gt;&amp;nbsp; if _n_ = 1 then do; &lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; declare hash h();&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; h.defineKey('id');&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; h.defineData('id','l');&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; h.defineDone();&lt;/P&gt;&lt;P&gt;&amp;nbsp; end;&lt;/P&gt;&lt;P&gt;&amp;nbsp; set have end=last;&lt;/P&gt;&lt;P&gt;&amp;nbsp; id = id_from;&lt;/P&gt;&lt;P&gt;&amp;nbsp; if h.find() ne 0 then do; &lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; id = id_to;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; l = CATX('/',id_from,id_to);&lt;/P&gt;&lt;P&gt;&amp;nbsp; end;&lt;/P&gt;&lt;P&gt;&amp;nbsp; else do;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; l = CATX('/',l,id_to);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; h.remove();&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; id = id_to;&lt;/P&gt;&lt;P&gt;&amp;nbsp; end;&lt;/P&gt;&lt;P&gt;&amp;nbsp; h.replace();&lt;/P&gt;&lt;P&gt;&amp;nbsp; if last then h.output(dataset:'h');&lt;/P&gt;&lt;P&gt;run;&lt;/P&gt;&lt;P&gt;data idfmt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; if _n_ = 1 then do;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; declare hash h();&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; h.defineKey('Start');&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; h.defineDone();&lt;/P&gt;&lt;P&gt;&amp;nbsp; end;&lt;/P&gt;&lt;P&gt;&amp;nbsp; set h;&lt;/P&gt;&lt;P&gt;&amp;nbsp; length Start Label $3;&lt;/P&gt;&lt;P&gt;&amp;nbsp; retain fmtname '$idfmt';&lt;/P&gt;&lt;P&gt;&amp;nbsp; Label = id;&lt;/P&gt;&lt;P&gt;&amp;nbsp; i=1;&lt;/P&gt;&lt;P&gt;&amp;nbsp; Start = SCAN(l,i,'/');&lt;/P&gt;&lt;P&gt;&amp;nbsp; do while(Start ne '');&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if Start ne Label and h.find() ne 0 then do;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; h.replace();&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; put (Start Label)(=);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; output;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; end;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; i+1;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Start = SCAN(l,i,'/');&lt;/P&gt;&lt;P&gt;&amp;nbsp; end;&lt;/P&gt;&lt;P&gt;&amp;nbsp; keep Start Label fmtname;&lt;/P&gt;&lt;P&gt;run;&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Fri, 25 May 2012 11:17:00 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Find-last-child/m-p/113771#M23465</guid>
      <dc:creator>Alpay</dc:creator>
      <dc:date>2012-05-25T11:17:00Z</dc:date>
    </item>
  </channel>
</rss>

