<?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 Pull date values from previous observations in SAS Programming</title>
    <link>https://communities.sas.com/t5/SAS-Programming/Pull-date-values-from-previous-observations/m-p/952012#M372111</link>
    <description>&lt;P&gt;Hi,&lt;/P&gt;&lt;P&gt;I have a dataset with employee id, start date, role code, role group and status.&amp;nbsp;&lt;/P&gt;&lt;TABLE&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD&gt;empid&lt;/TD&gt;&lt;TD&gt;start dt&lt;/TD&gt;&lt;TD&gt;role code&lt;/TD&gt;&lt;TD&gt;role group&lt;/TD&gt;&lt;TD&gt;status&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;101&lt;/TD&gt;&lt;TD&gt;01-Jan-20&lt;/TD&gt;&lt;TD&gt;231&lt;/TD&gt;&lt;TD&gt;AD1&lt;/TD&gt;&lt;TD&gt;A&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;101&lt;/TD&gt;&lt;TD&gt;01-May-20&lt;/TD&gt;&lt;TD&gt;231&lt;/TD&gt;&lt;TD&gt;AD1&lt;/TD&gt;&lt;TD&gt;A&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;101&lt;/TD&gt;&lt;TD&gt;01-Aug-20&lt;/TD&gt;&lt;TD&gt;232&lt;/TD&gt;&lt;TD&gt;AD1&lt;/TD&gt;&lt;TD&gt;A&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;101&lt;/TD&gt;&lt;TD&gt;01-Sep-20&lt;/TD&gt;&lt;TD&gt;301&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;A&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;101&lt;/TD&gt;&lt;TD&gt;01-Nov-20&lt;/TD&gt;&lt;TD&gt;301&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;A&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;102&lt;/TD&gt;&lt;TD&gt;01-Apr-21&lt;/TD&gt;&lt;TD&gt;231&lt;/TD&gt;&lt;TD&gt;AD1&lt;/TD&gt;&lt;TD&gt;A&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;102&lt;/TD&gt;&lt;TD&gt;01-Jun-21&lt;/TD&gt;&lt;TD&gt;231&lt;/TD&gt;&lt;TD&gt;AD1&lt;/TD&gt;&lt;TD&gt;D&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;102&lt;/TD&gt;&lt;TD&gt;01-Aug-22&lt;/TD&gt;&lt;TD&gt;231&lt;/TD&gt;&lt;TD&gt;AD1&lt;/TD&gt;&lt;TD&gt;A&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;From this table, I want to define another date variable 'effective'&lt;/P&gt;&lt;P&gt;- if employee has same role group or role code then effective should be minimum(very first) start&amp;nbsp; date.&lt;/P&gt;&lt;P&gt;-if employee status='D' meaning not Active then effective date should be that of previous record.&lt;/P&gt;&lt;P&gt;-if there is any entry after status=D meaning(rejoined) then effective should be start dt of new role.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Expected final table is&amp;nbsp;&lt;/P&gt;&lt;TABLE&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD&gt;empid&lt;/TD&gt;&lt;TD&gt;start dt&lt;/TD&gt;&lt;TD&gt;role code&lt;/TD&gt;&lt;TD&gt;role group&lt;/TD&gt;&lt;TD&gt;status&lt;/TD&gt;&lt;TD&gt;Effective&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;101&lt;/TD&gt;&lt;TD&gt;01-Jan-20&lt;/TD&gt;&lt;TD&gt;231&lt;/TD&gt;&lt;TD&gt;AD1&lt;/TD&gt;&lt;TD&gt;A&lt;/TD&gt;&lt;TD&gt;01-Jan-20&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;101&lt;/TD&gt;&lt;TD&gt;01-May-20&lt;/TD&gt;&lt;TD&gt;231&lt;/TD&gt;&lt;TD&gt;AD1&lt;/TD&gt;&lt;TD&gt;A&lt;/TD&gt;&lt;TD&gt;01-Jan-20&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;101&lt;/TD&gt;&lt;TD&gt;01-Aug-20&lt;/TD&gt;&lt;TD&gt;232&lt;/TD&gt;&lt;TD&gt;AD1&lt;/TD&gt;&lt;TD&gt;A&lt;/TD&gt;&lt;TD&gt;01-Jan-20&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;101&lt;/TD&gt;&lt;TD&gt;01-Sep-20&lt;/TD&gt;&lt;TD&gt;301&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;A&lt;/TD&gt;&lt;TD&gt;01-Sep-20&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;101&lt;/TD&gt;&lt;TD&gt;01-Nov-20&lt;/TD&gt;&lt;TD&gt;301&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;A&lt;/TD&gt;&lt;TD&gt;01-Sep-20&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;102&lt;/TD&gt;&lt;TD&gt;01-Apr-21&lt;/TD&gt;&lt;TD&gt;231&lt;/TD&gt;&lt;TD&gt;AD1&lt;/TD&gt;&lt;TD&gt;A&lt;/TD&gt;&lt;TD&gt;01-Apr-21&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;102&lt;/TD&gt;&lt;TD&gt;01-Jun-21&lt;/TD&gt;&lt;TD&gt;231&lt;/TD&gt;&lt;TD&gt;AD1&lt;/TD&gt;&lt;TD&gt;D&lt;/TD&gt;&lt;TD&gt;01-Apr-21&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;102&lt;/TD&gt;&lt;TD&gt;01-Aug-22&lt;/TD&gt;&lt;TD&gt;231&lt;/TD&gt;&lt;TD&gt;AD1&lt;/TD&gt;&lt;TD&gt;A&lt;/TD&gt;&lt;TD&gt;01-Aug-22&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;I tried lag function, first. and last. , but nothing worked.&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;Your help is truly appreciated!&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;Thanks,&lt;/SPAN&gt;&lt;/P&gt;</description>
    <pubDate>Tue, 26 Nov 2024 23:32:34 GMT</pubDate>
    <dc:creator>ItsMeAG</dc:creator>
    <dc:date>2024-11-26T23:32:34Z</dc:date>
    <item>
      <title>Pull date values from previous observations</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Pull-date-values-from-previous-observations/m-p/952012#M372111</link>
      <description>&lt;P&gt;Hi,&lt;/P&gt;&lt;P&gt;I have a dataset with employee id, start date, role code, role group and status.&amp;nbsp;&lt;/P&gt;&lt;TABLE&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD&gt;empid&lt;/TD&gt;&lt;TD&gt;start dt&lt;/TD&gt;&lt;TD&gt;role code&lt;/TD&gt;&lt;TD&gt;role group&lt;/TD&gt;&lt;TD&gt;status&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;101&lt;/TD&gt;&lt;TD&gt;01-Jan-20&lt;/TD&gt;&lt;TD&gt;231&lt;/TD&gt;&lt;TD&gt;AD1&lt;/TD&gt;&lt;TD&gt;A&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;101&lt;/TD&gt;&lt;TD&gt;01-May-20&lt;/TD&gt;&lt;TD&gt;231&lt;/TD&gt;&lt;TD&gt;AD1&lt;/TD&gt;&lt;TD&gt;A&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;101&lt;/TD&gt;&lt;TD&gt;01-Aug-20&lt;/TD&gt;&lt;TD&gt;232&lt;/TD&gt;&lt;TD&gt;AD1&lt;/TD&gt;&lt;TD&gt;A&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;101&lt;/TD&gt;&lt;TD&gt;01-Sep-20&lt;/TD&gt;&lt;TD&gt;301&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;A&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;101&lt;/TD&gt;&lt;TD&gt;01-Nov-20&lt;/TD&gt;&lt;TD&gt;301&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;A&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;102&lt;/TD&gt;&lt;TD&gt;01-Apr-21&lt;/TD&gt;&lt;TD&gt;231&lt;/TD&gt;&lt;TD&gt;AD1&lt;/TD&gt;&lt;TD&gt;A&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;102&lt;/TD&gt;&lt;TD&gt;01-Jun-21&lt;/TD&gt;&lt;TD&gt;231&lt;/TD&gt;&lt;TD&gt;AD1&lt;/TD&gt;&lt;TD&gt;D&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;102&lt;/TD&gt;&lt;TD&gt;01-Aug-22&lt;/TD&gt;&lt;TD&gt;231&lt;/TD&gt;&lt;TD&gt;AD1&lt;/TD&gt;&lt;TD&gt;A&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;From this table, I want to define another date variable 'effective'&lt;/P&gt;&lt;P&gt;- if employee has same role group or role code then effective should be minimum(very first) start&amp;nbsp; date.&lt;/P&gt;&lt;P&gt;-if employee status='D' meaning not Active then effective date should be that of previous record.&lt;/P&gt;&lt;P&gt;-if there is any entry after status=D meaning(rejoined) then effective should be start dt of new role.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Expected final table is&amp;nbsp;&lt;/P&gt;&lt;TABLE&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD&gt;empid&lt;/TD&gt;&lt;TD&gt;start dt&lt;/TD&gt;&lt;TD&gt;role code&lt;/TD&gt;&lt;TD&gt;role group&lt;/TD&gt;&lt;TD&gt;status&lt;/TD&gt;&lt;TD&gt;Effective&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;101&lt;/TD&gt;&lt;TD&gt;01-Jan-20&lt;/TD&gt;&lt;TD&gt;231&lt;/TD&gt;&lt;TD&gt;AD1&lt;/TD&gt;&lt;TD&gt;A&lt;/TD&gt;&lt;TD&gt;01-Jan-20&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;101&lt;/TD&gt;&lt;TD&gt;01-May-20&lt;/TD&gt;&lt;TD&gt;231&lt;/TD&gt;&lt;TD&gt;AD1&lt;/TD&gt;&lt;TD&gt;A&lt;/TD&gt;&lt;TD&gt;01-Jan-20&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;101&lt;/TD&gt;&lt;TD&gt;01-Aug-20&lt;/TD&gt;&lt;TD&gt;232&lt;/TD&gt;&lt;TD&gt;AD1&lt;/TD&gt;&lt;TD&gt;A&lt;/TD&gt;&lt;TD&gt;01-Jan-20&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;101&lt;/TD&gt;&lt;TD&gt;01-Sep-20&lt;/TD&gt;&lt;TD&gt;301&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;A&lt;/TD&gt;&lt;TD&gt;01-Sep-20&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;101&lt;/TD&gt;&lt;TD&gt;01-Nov-20&lt;/TD&gt;&lt;TD&gt;301&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;A&lt;/TD&gt;&lt;TD&gt;01-Sep-20&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;102&lt;/TD&gt;&lt;TD&gt;01-Apr-21&lt;/TD&gt;&lt;TD&gt;231&lt;/TD&gt;&lt;TD&gt;AD1&lt;/TD&gt;&lt;TD&gt;A&lt;/TD&gt;&lt;TD&gt;01-Apr-21&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;102&lt;/TD&gt;&lt;TD&gt;01-Jun-21&lt;/TD&gt;&lt;TD&gt;231&lt;/TD&gt;&lt;TD&gt;AD1&lt;/TD&gt;&lt;TD&gt;D&lt;/TD&gt;&lt;TD&gt;01-Apr-21&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;102&lt;/TD&gt;&lt;TD&gt;01-Aug-22&lt;/TD&gt;&lt;TD&gt;231&lt;/TD&gt;&lt;TD&gt;AD1&lt;/TD&gt;&lt;TD&gt;A&lt;/TD&gt;&lt;TD&gt;01-Aug-22&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;I tried lag function, first. and last. , but nothing worked.&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;Your help is truly appreciated!&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;Thanks,&lt;/SPAN&gt;&lt;/P&gt;</description>
      <pubDate>Tue, 26 Nov 2024 23:32:34 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Pull-date-values-from-previous-observations/m-p/952012#M372111</guid>
      <dc:creator>ItsMeAG</dc:creator>
      <dc:date>2024-11-26T23:32:34Z</dc:date>
    </item>
    <item>
      <title>Re: Pull date values from previous observations</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Pull-date-values-from-previous-observations/m-p/952018#M372114</link>
      <description>&lt;P&gt;Assuming I understood what you mean.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;data have;
infile cards expandtabs ;
input empid	startdt :date11.	rolecode 	rolegroup $ status $;
format startdt date11.;
cards;
101	01-Jan-20	231	AD1	A
101	01-May-20	231	AD1	A
101	01-Aug-20	232	AD1	A
101	01-Sep-20	301	 .	A
101	01-Nov-20	301	 .	A
102	01-Apr-21	231	AD1	A
102	01-Jun-21	231	AD1	D
102	01-Aug-22	231	AD1	A
;
data have;
 set have;
 by empid rolegroup status notsorted;
 group+first.status;
run;
proc sql;
create table want as
select *,
case 
when(status='A') then min(startdt)
when(status='D') then (select max(startdt) from have where empid=a.empid and startdt&amp;lt;a.startdt)
else . 
end as  effective format date11.
 from have as a
  group by group
   order by empid,startdt;
quit;&lt;/CODE&gt;&lt;/PRE&gt;</description>
      <pubDate>Wed, 27 Nov 2024 01:44:47 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Pull-date-values-from-previous-observations/m-p/952018#M372114</guid>
      <dc:creator>Ksharp</dc:creator>
      <dc:date>2024-11-27T01:44:47Z</dc:date>
    </item>
    <item>
      <title>Re: Pull date values from previous observations</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Pull-date-values-from-previous-observations/m-p/952023#M372117</link>
      <description>&lt;P&gt;You didn't show your code using the LAG function, but I bet you used it in the THEN clause of an IF ... THEN statement, which would mean that the lagged values would come from the last observation when the IF condition was true, not necessarily from the immediately previous observation (that's because the LAG function is a FIFO queue updater, not a "lookback").&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Here is code that uses FIRST.&amp;nbsp; and LAG functions suitable for your purpose, which allows you to have a single DATA step solution:&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;data have;
infile cards expandtabs ;
input empid	startdt :date11.	rolecode 	rolegroup $ status $;
format startdt date11.;
cards;
101	01-Jan-20	231	AD1	A
101	01-May-20	231	AD1	A
101	01-Aug-20	232	AD1	A
101	01-Sep-20	301	 .	A
101	01-Nov-20	301	 .	A
102	01-Apr-21	231	AD1	A
102	01-Jun-21	231	AD1	D
102	01-Aug-22	231	AD1	A
;

data want;
  set have;
  by empid ;

  retain effective;
  format effective date9.;

  if first.empid then effective=startdt;
  if first.empid=0 and rolecode^=lag(rolecode) and rolegroup^=lag(rolegroup) then effective=startdt;
  if status='A' and lag(status)='D' then effective=startdt;
run;&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Notice the second IF statement does not begin as ELSE if.&amp;nbsp; Otherwise the values produced by the LAG functions would not be synchronized with the immediately preceding observations.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;And if you want to have more extensive use of FIRST. and less use of LAG:&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;data want;
  set have;
  by empid rolecode notsorted;

  set have (keep=empid rolegroup);
  by empid rolegroup notsorted;

  retain effective;
  format effective date9.;

  if first.empid then effective=startdt;
  else if first.rolecode and first.rolegroup then effective=startdt;

  if status='A' and lag(status)='D' then effective=startdt;
run;&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;Note that there are two pairs of SET + BY statements.&amp;nbsp; The second SET rereads the observation read by the first.&amp;nbsp; I do it that way because the program needs independently constructed FIRST.ROLECODE and FIRST.ROLEGROUP dummies.&amp;nbsp; If both of those variables had been in a single BY statement, then they would not be independent.&amp;nbsp; Detection of a FIRST. condition on any given BY variable would force a FIRST. condition on all subsequent vars in the BY statement.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Thu, 28 Nov 2024 23:10:51 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Pull-date-values-from-previous-observations/m-p/952023#M372117</guid>
      <dc:creator>mkeintz</dc:creator>
      <dc:date>2024-11-28T23:10:51Z</dc:date>
    </item>
  </channel>
</rss>

