<?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: Create date range variables by comparing current observation with previous and post observation in SAS Procedures</title>
    <link>https://communities.sas.com/t5/SAS-Procedures/Create-date-range-variables-by-comparing-current-observation/m-p/289178#M59619</link>
    <description>&lt;P&gt;Hi RW9,&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Yes, you got the question right. I want to merge those 3 records (pre-match, current, post-match) and create two new date variables&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;MAX_&lt;/SPAN&gt;&lt;SPAN&gt;DT&lt;/SPAN&gt;&lt;SPAN&gt;_&lt;/SPAN&gt;&lt;SPAN&gt;BFOR&lt;/SPAN&gt;&lt;SPAN&gt;_VALID_&lt;/SPAN&gt;&lt;SPAN&gt;DTTM &amp;amp;&amp;nbsp;MIN_&lt;SPAN&gt;DT&lt;/SPAN&gt;&lt;SPAN&gt;_&lt;/SPAN&gt;&lt;SPAN&gt;AFTR&lt;/SPAN&gt;&lt;SPAN&gt;_VALID_&lt;/SPAN&gt;&lt;SPAN&gt;DTTM&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt; as shown below.&lt;/P&gt;
&lt;P&gt;I will then use these two date variables to do the further logic.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Desired Output for me:&lt;/P&gt;
&lt;TABLE width="793"&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD width="71"&gt;&amp;nbsp;CURR_RK&lt;/TD&gt;
&lt;TD width="64"&gt;ORIG_RK&lt;/TD&gt;
&lt;TD width="70"&gt;CUST_SK&lt;/TD&gt;
&lt;TD width="89"&gt;VALID_DTTM&lt;/TD&gt;
&lt;TD width="62"&gt;FLAG&lt;/TD&gt;
&lt;TD width="110"&gt;MAX_DT_BFOR_VALID_DTTM&lt;/TD&gt;
&lt;TD width="103"&gt;MIN_DT_AFTR_VALID_DTTM&lt;/TD&gt;
&lt;TD width="112"&gt;EXPECTED FINAL VALID_DTTM&lt;/TD&gt;
&lt;TD width="112"&gt;EXPECTED FINAL CUST_SK&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;41&lt;/TD&gt;
&lt;TD&gt;2673&lt;/TD&gt;
&lt;TD&gt;2342321&lt;/TD&gt;
&lt;TD&gt;1-Sep-12&lt;/TD&gt;
&lt;TD width="62"&gt;FALSE&lt;/TD&gt;
&lt;TD width="110"&gt;-&lt;/TD&gt;
&lt;TD width="103"&gt;1-Jan-13&lt;/TD&gt;
&lt;TD width="112"&gt;1-Jan-13&lt;/TD&gt;
&lt;TD width="112"&gt;12559928&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;41&lt;/TD&gt;
&lt;TD&gt;41&lt;/TD&gt;
&lt;TD&gt;12559928&lt;/TD&gt;
&lt;TD&gt;1-Jan-13&lt;/TD&gt;
&lt;TD width="62"&gt;TRUE&lt;/TD&gt;
&lt;TD width="110"&gt;1-Jan-13&lt;/TD&gt;
&lt;TD width="103"&gt;1-Oct-14&lt;/TD&gt;
&lt;TD width="112"&gt;1-Jan-13&lt;/TD&gt;
&lt;TD width="112"&gt;12559928&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;41&lt;/TD&gt;
&lt;TD&gt;4615581&lt;/TD&gt;
&lt;TD&gt;14452649&lt;/TD&gt;
&lt;TD&gt;1-Feb-13&lt;/TD&gt;
&lt;TD width="62"&gt;FALSE&lt;/TD&gt;
&lt;TD width="110"&gt;1-Jan-13&lt;/TD&gt;
&lt;TD width="103"&gt;1-Oct-14&lt;/TD&gt;
&lt;TD width="112"&gt;1-Jan-13&lt;/TD&gt;
&lt;TD width="112"&gt;12559928&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;41&lt;/TD&gt;
&lt;TD&gt;4615581&lt;/TD&gt;
&lt;TD&gt;67316104&lt;/TD&gt;
&lt;TD&gt;1-Aug-14&lt;/TD&gt;
&lt;TD width="62"&gt;FALSE&lt;/TD&gt;
&lt;TD width="110"&gt;1-Jan-13&lt;/TD&gt;
&lt;TD width="103"&gt;1-Oct-14&lt;/TD&gt;
&lt;TD width="112"&gt;1-Jan-13&lt;/TD&gt;
&lt;TD width="112"&gt;12559928&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;41&lt;/TD&gt;
&lt;TD&gt;41&lt;/TD&gt;
&lt;TD&gt;72971041&lt;/TD&gt;
&lt;TD&gt;1-Oct-14&lt;/TD&gt;
&lt;TD width="62"&gt;TRUE&lt;/TD&gt;
&lt;TD width="110"&gt;1-Oct-14&lt;/TD&gt;
&lt;TD width="103"&gt;-&lt;/TD&gt;
&lt;TD width="112"&gt;1-Oct-14&lt;/TD&gt;
&lt;TD width="112"&gt;72971041&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;41&lt;/TD&gt;
&lt;TD&gt;4615581&lt;/TD&gt;
&lt;TD&gt;74341618&lt;/TD&gt;
&lt;TD&gt;1-Nov-14&lt;/TD&gt;
&lt;TD width="62"&gt;FALSE&lt;/TD&gt;
&lt;TD width="110"&gt;1-Oct-14&lt;/TD&gt;
&lt;TD width="103"&gt;-&lt;/TD&gt;
&lt;TD width="112"&gt;1-Oct-14&lt;/TD&gt;
&lt;TD width="112"&gt;72971041&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;41&lt;/TD&gt;
&lt;TD&gt;8828883&lt;/TD&gt;
&lt;TD&gt;63829111&lt;/TD&gt;
&lt;TD&gt;1-Jul-15&lt;/TD&gt;
&lt;TD width="62"&gt;FALSE&lt;/TD&gt;
&lt;TD width="110"&gt;1-Oct-14&lt;/TD&gt;
&lt;TD width="103"&gt;-&lt;/TD&gt;
&lt;TD width="112"&gt;1-Oct-14&lt;/TD&gt;
&lt;TD width="112"&gt;72971041&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;9217&lt;/TD&gt;
&lt;TD&gt;9217&lt;/TD&gt;
&lt;TD&gt;21128775&lt;/TD&gt;
&lt;TD&gt;1-Jan-13&lt;/TD&gt;
&lt;TD width="62"&gt;TRUE&lt;/TD&gt;
&lt;TD width="110"&gt;1-Jan-13&lt;/TD&gt;
&lt;TD width="103"&gt;1-Mar-13&lt;/TD&gt;
&lt;TD width="112"&gt;1-Jan-13&lt;/TD&gt;
&lt;TD&gt;21128775&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;9217&lt;/TD&gt;
&lt;TD&gt;10124544&lt;/TD&gt;
&lt;TD&gt;15142897&lt;/TD&gt;
&lt;TD&gt;1-Jan-13&lt;/TD&gt;
&lt;TD width="62"&gt;FALSE&lt;/TD&gt;
&lt;TD width="110"&gt;1-Jan-13&lt;/TD&gt;
&lt;TD width="103"&gt;1-Mar-13&lt;/TD&gt;
&lt;TD&gt;1-Jan-13&lt;/TD&gt;
&lt;TD&gt;21128775&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;9217&lt;/TD&gt;
&lt;TD&gt;9217&lt;/TD&gt;
&lt;TD&gt;30874351&lt;/TD&gt;
&lt;TD&gt;1-Mar-13&lt;/TD&gt;
&lt;TD width="62"&gt;TRUE&lt;/TD&gt;
&lt;TD width="110"&gt;1-Mar-13&lt;/TD&gt;
&lt;TD width="103"&gt;1-Sep-14&lt;/TD&gt;
&lt;TD&gt;1-Mar-13&lt;/TD&gt;
&lt;TD&gt;30874351&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;9217&lt;/TD&gt;
&lt;TD&gt;9217&lt;/TD&gt;
&lt;TD&gt;71276102&lt;/TD&gt;
&lt;TD&gt;1-Sep-14&lt;/TD&gt;
&lt;TD width="62"&gt;TRUE&lt;/TD&gt;
&lt;TD width="110"&gt;1-Sep-14&lt;/TD&gt;
&lt;TD width="103"&gt;1-Nov-14&lt;/TD&gt;
&lt;TD&gt;1-Sep-14&lt;/TD&gt;
&lt;TD&gt;71276102&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;9217&lt;/TD&gt;
&lt;TD&gt;10124544&lt;/TD&gt;
&lt;TD&gt;74885982&lt;/TD&gt;
&lt;TD&gt;1-Nov-14&lt;/TD&gt;
&lt;TD width="62"&gt;FALSE&lt;/TD&gt;
&lt;TD width="110"&gt;1-Sep-14&lt;/TD&gt;
&lt;TD width="103"&gt;-&lt;/TD&gt;
&lt;TD&gt;1-Sep-14&lt;/TD&gt;
&lt;TD&gt;71276102&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;346372&lt;/TD&gt;
&lt;TD&gt;346372&lt;/TD&gt;
&lt;TD&gt;6478392&lt;/TD&gt;
&lt;TD&gt;1-Sep-14&lt;/TD&gt;
&lt;TD width="62"&gt;TRUE&lt;/TD&gt;
&lt;TD width="110"&gt;1-Sep-14&lt;/TD&gt;
&lt;TD width="103"&gt;1-Sep-14&lt;/TD&gt;
&lt;TD&gt;1-Sep-14&lt;/TD&gt;
&lt;TD&gt;6478392&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;7801669&lt;/TD&gt;
&lt;TD&gt;6368875&lt;/TD&gt;
&lt;TD&gt;2591876&lt;/TD&gt;
&lt;TD&gt;1-Dec-12&lt;/TD&gt;
&lt;TD width="62"&gt;FALSE&lt;/TD&gt;
&lt;TD width="110"&gt;-&lt;/TD&gt;
&lt;TD width="103"&gt;1-Jan-13&lt;/TD&gt;
&lt;TD&gt;1-Jan-13&lt;/TD&gt;
&lt;TD&gt;3829995&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;7801669&lt;/TD&gt;
&lt;TD&gt;7801669&lt;/TD&gt;
&lt;TD&gt;3829995&lt;/TD&gt;
&lt;TD&gt;1-Jan-13&lt;/TD&gt;
&lt;TD width="62"&gt;TRUE&lt;/TD&gt;
&lt;TD width="110"&gt;1-Jan-13&lt;/TD&gt;
&lt;TD width="103"&gt;1-Aug-15&lt;/TD&gt;
&lt;TD&gt;1-Jan-13&lt;/TD&gt;
&lt;TD&gt;3829995&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;7801669&lt;/TD&gt;
&lt;TD&gt;7801669&lt;/TD&gt;
&lt;TD&gt;97082679&lt;/TD&gt;
&lt;TD&gt;1-Aug-15&lt;/TD&gt;
&lt;TD width="62"&gt;TRUE&lt;/TD&gt;
&lt;TD width="110"&gt;1-Aug-15&lt;/TD&gt;
&lt;TD width="103"&gt;1-Nov-15&lt;/TD&gt;
&lt;TD&gt;1-Aug-15&lt;/TD&gt;
&lt;TD&gt;97082679&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;7801669&lt;/TD&gt;
&lt;TD&gt;6368875&lt;/TD&gt;
&lt;TD&gt;106930088&lt;/TD&gt;
&lt;TD&gt;1-Nov-15&lt;/TD&gt;
&lt;TD width="62"&gt;FALSE&lt;/TD&gt;
&lt;TD width="110"&gt;1-Nov-15&lt;/TD&gt;
&lt;TD width="103"&gt;1-Nov-15&lt;/TD&gt;
&lt;TD width="112"&gt;1-Nov-15&lt;/TD&gt;
&lt;TD&gt;107207912&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;7801669&lt;/TD&gt;
&lt;TD&gt;7801669&lt;/TD&gt;
&lt;TD&gt;107207912&lt;/TD&gt;
&lt;TD&gt;1-Nov-15&lt;/TD&gt;
&lt;TD width="62"&gt;TRUE&lt;/TD&gt;
&lt;TD width="110"&gt;1-Nov-15&lt;/TD&gt;
&lt;TD width="103"&gt;-&lt;/TD&gt;
&lt;TD&gt;1-Nov-15&lt;/TD&gt;
&lt;TD&gt;107207912&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;Thanks for the logic provided.&amp;nbsp;I tried it in SAS&amp;nbsp;but it's throwing CORRELATION errors.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;proc sql;&lt;BR /&gt; create table WANT as&lt;BR /&gt; select A.*,&lt;BR /&gt; B.VALID_DTTM as PREV_DTTM,&lt;BR /&gt; C.VALID_DTTM as NEXT_DTTM&lt;BR /&gt; from ONE A&lt;BR /&gt; left join (select * from ONE group by CURR_RK having CURR_RK=A.CURR_RK and VALID_DTTM &amp;lt; A.VALID_DTTM and VALID_DTTM=max(VALID_DTTM)) B&lt;BR /&gt; on A.CURR_RK=B.CURR_RK&lt;BR /&gt; left join (select * from ONE group by CURR_RK having CURR_RK=A.CURR_RK and VALID_DTTM &amp;gt; A.VALID_DTTM and VALID_DTTM=min(VALID_DTTM)) C&lt;BR /&gt; on A.CURR_RK=C.CURR_RK;&lt;BR /&gt;quit;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;SQL error:&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;ERROR: Correlated reference to column CURR_RK is not contained within a subquery.&lt;/STRONG&gt;&lt;BR /&gt;&lt;STRONG&gt;ERROR: Correlated reference to column VALID_DTTM is not contained within a subquery.&lt;/STRONG&gt;&lt;BR /&gt;&lt;STRONG&gt;ERROR: Correlated reference to column CURR_RK is not contained within a subquery.&lt;/STRONG&gt;&lt;BR /&gt;&lt;STRONG&gt;ERROR: Correlated reference to column VALID_DTTM is not contained within a subquery.&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;The query seems to be correct but I am not sure what is causing the issue.&amp;nbsp;&lt;/P&gt;
&lt;P&gt;I need to investigate and see if it gives me the desired new date variables.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Thanks once again.&lt;/P&gt;</description>
    <pubDate>Wed, 03 Aug 2016 12:14:30 GMT</pubDate>
    <dc:creator>ravib</dc:creator>
    <dc:date>2016-08-03T12:14:30Z</dc:date>
    <item>
      <title>Create date range variables by comparing current observation with previous and post observation</title>
      <link>https://communities.sas.com/t5/SAS-Procedures/Create-date-range-variables-by-comparing-current-observation/m-p/289115#M59609</link>
      <description>&lt;P&gt;Hi,&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;I am facing problem in reading each observation from input table and compare its values against the previous record or next record based on certain conditions in the logic. Appreciate if I can get any help from this group.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;My current data looks like:&lt;/P&gt;
&lt;P&gt;***************************************&lt;/P&gt;
&lt;P&gt;data one;&lt;BR /&gt; infile datalines;&lt;BR /&gt; input CURR_RK ORIG_RK CUST_SK VALID_DTTM: anydtdte10. ;&lt;BR /&gt; format VALID_DTTM date9.;&lt;BR /&gt; datalines;&lt;BR /&gt;41 2673 2342321 1-Sep-12&lt;BR /&gt;41 41 12559928 1-Jan-13&lt;BR /&gt;41 4615581 14452649 1-Feb-13&lt;BR /&gt;41 4615581 67316104 1-Aug-14&lt;BR /&gt;41 41 72971041 1-Oct-14&lt;BR /&gt;41 4615581 74341618 1-Nov-14&lt;BR /&gt;41 8828883 63829111 1-Jul-15&lt;BR /&gt;9217 9217 21128775 1-Jan-13&lt;BR /&gt;9217 10124544 15142897 1-Jan-13&lt;BR /&gt;9217 9217 30874351 1-Mar-13&lt;BR /&gt;9217 9217 71276102 1-Sep-14&lt;BR /&gt;9217 10124544 74885982 1-Nov-14&lt;BR /&gt;346372 346372 6478392 1-Sep-14&lt;BR /&gt;7801669 6368875 2591876 1-Dec-12&lt;BR /&gt;7801669 7801669 3829995 1-Jan-13&lt;BR /&gt;7801669 7801669 97082679 1-Aug-15&lt;BR /&gt;7801669 6368875 106930088 1-Oct-15&lt;BR /&gt;7801669 7801669 107207912 1-Nov-15&lt;BR /&gt;;&lt;BR /&gt;run;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;***************************************&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;The logic required is something like below:&lt;/P&gt;
&lt;P&gt;For each curr_rk by group, I need to check as below:&lt;/P&gt;
&lt;P&gt;&amp;gt;&amp;gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;Scenario#1:&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;if first&lt;/SPAN&gt;&lt;SPAN&gt;.curr_rk and&amp;nbsp;curr_rk = orig_rk then assign&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;&amp;nbsp; new_sk=CUST_SK and new_dt =&amp;nbsp;&lt;SPAN&gt;VALID_DTTM&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;Scenario#2&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;if first.curr_rk and curr_rk ^= orig_rk&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN&gt;then &lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;go down below to the next matching record&lt;/SPAN&gt;&lt;SPAN&gt;&amp;nbsp;(i.e. with curr_rk = orig_rk)&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;Bring it's CUST_SK &amp;amp; VALID_DTTM to replace the values of the current record.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;&lt;BR /&gt;Scenario#3:&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;if not first.curr_rk and&amp;nbsp;curr_rk = orig_rk then assign&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;new_sk=CUST_SK and new_dt =&amp;nbsp;&lt;SPAN&gt;VALID_DTTM&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;Scenario#4:&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;if not first.curr_rk and curr_rk ^= orig_rk&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN&gt;then&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;go up above to the nearest matching record (i.e.&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN&gt;with curr_rk = orig_rk)&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;Bring it's CUST_SK &amp;amp; VALID_DTTM to replace the values of the current record.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;In this process,&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN&gt;I have sorted the input table and used "retain" statement to fetch desired values.&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN&gt;But challenge is my input table sometimes has "non-matching" record occuring first and&amp;nbsp;matching-record is followed later on.&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN&gt;In such cases, retain statement is not working.&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN&gt;Hence I thought of&amp;nbsp;creating two date range variables (MAX_DT_BFOR_VALID_DTTM &amp;amp; MIN_DT_AFTR_VALID_DTTM) based on each record's VALID_DTTM compared against its corresponding pre-match and post-match records. &lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;Please refer the attached excel sheet with desired output results shown.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;I am ok if there is a better approach with out using these variables. Also I need to create the output in&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN&gt;Oracle.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Hope I am able to explain the issue well. Please let me know if any more information is required.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Thanks a lot in advance.&lt;/P&gt;</description>
      <pubDate>Wed, 03 Aug 2016 07:15:14 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Procedures/Create-date-range-variables-by-comparing-current-observation/m-p/289115#M59609</guid>
      <dc:creator>ravib</dc:creator>
      <dc:date>2016-08-03T07:15:14Z</dc:date>
    </item>
    <item>
      <title>Re: Create date range variables by comparing current observation with previous and post observation</title>
      <link>https://communities.sas.com/t5/SAS-Procedures/Create-date-range-variables-by-comparing-current-observation/m-p/289119#M59610</link>
      <description>&lt;P&gt;If you need to get data from 'later' records, how about reversing the order of the dataset, so you can use retain then?&lt;/P&gt;</description>
      <pubDate>Wed, 03 Aug 2016 07:37:47 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Procedures/Create-date-range-variables-by-comparing-current-observation/m-p/289119#M59610</guid>
      <dc:creator>Kurt_Bremser</dc:creator>
      <dc:date>2016-08-03T07:37:47Z</dc:date>
    </item>
    <item>
      <title>Re: Create date range variables by comparing current observation with previous and post observation</title>
      <link>https://communities.sas.com/t5/SAS-Procedures/Create-date-range-variables-by-comparing-current-observation/m-p/289124#M59611</link>
      <description>&lt;P&gt;Hi,&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Thanks for the quick response.&lt;/P&gt;
&lt;P&gt;I need both. Some times I need previous record values and some times I need later record values depending on the conditions.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Do you mean, first fetch from the previous records into a dataset and then sort it again in reverse order to fetch values from later records? Will it work?&lt;/P&gt;</description>
      <pubDate>Wed, 03 Aug 2016 08:11:25 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Procedures/Create-date-range-variables-by-comparing-current-observation/m-p/289124#M59611</guid>
      <dc:creator>ravib</dc:creator>
      <dc:date>2016-08-03T08:11:25Z</dc:date>
    </item>
    <item>
      <title>Re: Create date range variables by comparing current observation with previous and post observation</title>
      <link>https://communities.sas.com/t5/SAS-Procedures/Create-date-range-variables-by-comparing-current-observation/m-p/289126#M59612</link>
      <description>&lt;P&gt;Yes.&lt;/P&gt;
&lt;P&gt;If you do not already have a variable that defines your order, then you can create one in the first pass by using _N_.&lt;/P&gt;
&lt;P&gt;Then sort descending by that variable, do your reverse pass, and then sort again (without descending) to get the original order.&lt;/P&gt;
&lt;P&gt;If you use out= in the proc sort statement to create new datasets, you can add a drop= dataset option to get rid of the "order" variable.&lt;/P&gt;
&lt;P&gt;Here's an example to illustrate what I mean:&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;data have;
input value condition;
cards;
3 0
4 1
5 2
6 0
7 1
8 0
;
run;

data firstpass (drop=keepval);
set have;
retain keepval;
order = _n_;
if condition = 0 then keepval = value;
if condition = 1 then value = keepval;
run;

proc sort data=firstpass;
by descending order;
run;

data secondpass (drop=keepval);
set firstpass;
retain keepval;
if condition = 0 then keepval = value;
if condition = 2 then value = keepval;
run;

proc sort
  data=secondpass
  out=want (drop=order)
;
by order;
run;

proc print;
run;
&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;In the end, you get this output:&lt;/P&gt;
&lt;PRE&gt;Obs    value    condition

 1       3          0    
 2       3          1    
 3       6          2    
 4       6          0    
 5       6          1    
 6       8          0    
&lt;/PRE&gt;</description>
      <pubDate>Wed, 03 Aug 2016 08:25:16 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Procedures/Create-date-range-variables-by-comparing-current-observation/m-p/289126#M59612</guid>
      <dc:creator>Kurt_Bremser</dc:creator>
      <dc:date>2016-08-03T08:25:16Z</dc:date>
    </item>
    <item>
      <title>Re: Create date range variables by comparing current observation with previous and post observation</title>
      <link>https://communities.sas.com/t5/SAS-Procedures/Create-date-range-variables-by-comparing-current-observation/m-p/289127#M59613</link>
      <description>&lt;P&gt;PS if you only need data from the immediately preceding observation in both directions, you can also use the lag() function.&lt;/P&gt;</description>
      <pubDate>Wed, 03 Aug 2016 08:27:26 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Procedures/Create-date-range-variables-by-comparing-current-observation/m-p/289127#M59613</guid>
      <dc:creator>Kurt_Bremser</dc:creator>
      <dc:date>2016-08-03T08:27:26Z</dc:date>
    </item>
    <item>
      <title>Re: Create date range variables by comparing current observation with previous and post observation</title>
      <link>https://communities.sas.com/t5/SAS-Procedures/Create-date-range-variables-by-comparing-current-observation/m-p/289129#M59614</link>
      <description>&lt;P&gt;ITs a bit oif a confusing post here, basically you need the current record, the previous record which matches, and the next record that matches, merge these three together, then perform your logic check. &amp;nbsp;My question is how do you know the order of the data, does a "previous" record mean one that matches the criteria and has max(date) &amp;lt; current record? &amp;nbsp;If so then something like:&lt;/P&gt;
&lt;PRE&gt;proc sql;
  create table WANT as
  select  A.*,
          B.VALID_DTTM as PREV_DTTM,
          C.VALID_DTTM as NEXT_DTTM
  from    ONE A
  left join (select * from ONE group by CURR_RK having CURR_RK=A.CURR_RK and VALID_DTTM &amp;lt; A.VALID_DTTM and VALID_DTTM=max(VALID_DTTM)) B
  on      A.CURR_RK=B.CURR_RK
  left join (select * from ONE group by CURR_RK having CURR_RK=A.CURR_RK and VALID_DTTM &amp;gt; A.VALID_DTTM and VALID_DTTM=min(VALID_DTTM)) C
  on      A.CURR_RK=C.CURR_RK;
quit;

data want;
  set want;
  by curr_rk;
  if first.curr_rk and ...
run;&lt;/PRE&gt;</description>
      <pubDate>Wed, 03 Aug 2016 08:32:25 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Procedures/Create-date-range-variables-by-comparing-current-observation/m-p/289129#M59614</guid>
      <dc:creator>RW9</dc:creator>
      <dc:date>2016-08-03T08:32:25Z</dc:date>
    </item>
    <item>
      <title>Re: Create date range variables by comparing current observation with previous and post observation</title>
      <link>https://communities.sas.com/t5/SAS-Procedures/Create-date-range-variables-by-comparing-current-observation/m-p/289134#M59615</link>
      <description>&lt;PRE&gt;
No. Post data here. No one would like to download file from website.


data one;
infile datalines;
input CURR_RK ORIG_RK CUST_SK VALID_DTTM: anydtdte10. ;
format VALID_DTTM date9.;
datalines;
41 2673 2342321 1-Sep-12
41 41 12559928 1-Jan-13
41 4615581 14452649 1-Feb-13
41 4615581 67316104 1-Aug-14
41 41 72971041 1-Oct-14
41 4615581 74341618 1-Nov-14
41 8828883 63829111 1-Jul-15
9217 9217 21128775 1-Jan-13
9217 10124544 15142897 1-Jan-13
9217 9217 30874351 1-Mar-13
9217 9217 71276102 1-Sep-14
9217 10124544 74885982 1-Nov-14
346372 346372 6478392 1-Sep-14
7801669 6368875 2591876 1-Dec-12
7801669 7801669 3829995 1-Jan-13
7801669 7801669 97082679 1-Aug-15
7801669 6368875 106930088 1-Oct-15
7801669 7801669 107207912 1-Nov-15
;
run;

data one;
 set one;
 by curr_rk;
 if first.curr_rk then n=0;
 n+1;
run;
data want;
 if _n_=1 then do;
  if 0 then set one(rename=(CUST_SK=new_sk VALID_DTTM=new_dt));
  declare hash h1(dataset:'one(rename=(CUST_SK=new_sk VALID_DTTM=new_dt)
   where=(CURR_RK=ORIG_RK))');
  h1.definekey('CURR_RK','ORIG_RK');
  h1.definedata('new_sk','new_dt');
  h1.definedone();
  
  if 0 then set one(keep=ORIG_RK rename=(ORIG_RK=_ORIG_RK));
  declare hash h2(dataset:'one(rename=(ORIG_RK=_ORIG_RK 
   CUST_SK=new_sk VALID_DTTM=new_dt))');
  h2.definekey('CURR_RK','n');
  h2.definedata('new_sk','new_dt','_ORIG_RK');
  h2.definedone();
 end;
set one;
by curr_rk;
if first.curr_rk then do;
 if curr_rk = orig_rk then do;new_sk=CUST_SK; new_dt=VALID_DTTM;end;
  else do;call missing(new_sk,new_dt);rc=h1.find(key:CURR_RK,key:CURR_RK);end;
end;
else do;
 if curr_rk = orig_rk then do;new_sk=CUST_SK; new_dt=VALID_DTTM;end;
  else do;
   do k=n-1 to 1 by -1;
    call missing(new_sk,new_dt);
    rc=h2.find(key:CURR_RK,key:k);
    if CURR_RK=_ORIG_RK then leave;
   end;
  end;
end;
drop rc k n _ORIG_RK;
run;
&lt;/PRE&gt;</description>
      <pubDate>Wed, 03 Aug 2016 09:15:25 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Procedures/Create-date-range-variables-by-comparing-current-observation/m-p/289134#M59615</guid>
      <dc:creator>Ksharp</dc:creator>
      <dc:date>2016-08-03T09:15:25Z</dc:date>
    </item>
    <item>
      <title>Re: Create date range variables by comparing current observation with previous and post observation</title>
      <link>https://communities.sas.com/t5/SAS-Procedures/Create-date-range-variables-by-comparing-current-observation/m-p/289178#M59619</link>
      <description>&lt;P&gt;Hi RW9,&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Yes, you got the question right. I want to merge those 3 records (pre-match, current, post-match) and create two new date variables&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;MAX_&lt;/SPAN&gt;&lt;SPAN&gt;DT&lt;/SPAN&gt;&lt;SPAN&gt;_&lt;/SPAN&gt;&lt;SPAN&gt;BFOR&lt;/SPAN&gt;&lt;SPAN&gt;_VALID_&lt;/SPAN&gt;&lt;SPAN&gt;DTTM &amp;amp;&amp;nbsp;MIN_&lt;SPAN&gt;DT&lt;/SPAN&gt;&lt;SPAN&gt;_&lt;/SPAN&gt;&lt;SPAN&gt;AFTR&lt;/SPAN&gt;&lt;SPAN&gt;_VALID_&lt;/SPAN&gt;&lt;SPAN&gt;DTTM&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt; as shown below.&lt;/P&gt;
&lt;P&gt;I will then use these two date variables to do the further logic.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Desired Output for me:&lt;/P&gt;
&lt;TABLE width="793"&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD width="71"&gt;&amp;nbsp;CURR_RK&lt;/TD&gt;
&lt;TD width="64"&gt;ORIG_RK&lt;/TD&gt;
&lt;TD width="70"&gt;CUST_SK&lt;/TD&gt;
&lt;TD width="89"&gt;VALID_DTTM&lt;/TD&gt;
&lt;TD width="62"&gt;FLAG&lt;/TD&gt;
&lt;TD width="110"&gt;MAX_DT_BFOR_VALID_DTTM&lt;/TD&gt;
&lt;TD width="103"&gt;MIN_DT_AFTR_VALID_DTTM&lt;/TD&gt;
&lt;TD width="112"&gt;EXPECTED FINAL VALID_DTTM&lt;/TD&gt;
&lt;TD width="112"&gt;EXPECTED FINAL CUST_SK&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;41&lt;/TD&gt;
&lt;TD&gt;2673&lt;/TD&gt;
&lt;TD&gt;2342321&lt;/TD&gt;
&lt;TD&gt;1-Sep-12&lt;/TD&gt;
&lt;TD width="62"&gt;FALSE&lt;/TD&gt;
&lt;TD width="110"&gt;-&lt;/TD&gt;
&lt;TD width="103"&gt;1-Jan-13&lt;/TD&gt;
&lt;TD width="112"&gt;1-Jan-13&lt;/TD&gt;
&lt;TD width="112"&gt;12559928&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;41&lt;/TD&gt;
&lt;TD&gt;41&lt;/TD&gt;
&lt;TD&gt;12559928&lt;/TD&gt;
&lt;TD&gt;1-Jan-13&lt;/TD&gt;
&lt;TD width="62"&gt;TRUE&lt;/TD&gt;
&lt;TD width="110"&gt;1-Jan-13&lt;/TD&gt;
&lt;TD width="103"&gt;1-Oct-14&lt;/TD&gt;
&lt;TD width="112"&gt;1-Jan-13&lt;/TD&gt;
&lt;TD width="112"&gt;12559928&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;41&lt;/TD&gt;
&lt;TD&gt;4615581&lt;/TD&gt;
&lt;TD&gt;14452649&lt;/TD&gt;
&lt;TD&gt;1-Feb-13&lt;/TD&gt;
&lt;TD width="62"&gt;FALSE&lt;/TD&gt;
&lt;TD width="110"&gt;1-Jan-13&lt;/TD&gt;
&lt;TD width="103"&gt;1-Oct-14&lt;/TD&gt;
&lt;TD width="112"&gt;1-Jan-13&lt;/TD&gt;
&lt;TD width="112"&gt;12559928&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;41&lt;/TD&gt;
&lt;TD&gt;4615581&lt;/TD&gt;
&lt;TD&gt;67316104&lt;/TD&gt;
&lt;TD&gt;1-Aug-14&lt;/TD&gt;
&lt;TD width="62"&gt;FALSE&lt;/TD&gt;
&lt;TD width="110"&gt;1-Jan-13&lt;/TD&gt;
&lt;TD width="103"&gt;1-Oct-14&lt;/TD&gt;
&lt;TD width="112"&gt;1-Jan-13&lt;/TD&gt;
&lt;TD width="112"&gt;12559928&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;41&lt;/TD&gt;
&lt;TD&gt;41&lt;/TD&gt;
&lt;TD&gt;72971041&lt;/TD&gt;
&lt;TD&gt;1-Oct-14&lt;/TD&gt;
&lt;TD width="62"&gt;TRUE&lt;/TD&gt;
&lt;TD width="110"&gt;1-Oct-14&lt;/TD&gt;
&lt;TD width="103"&gt;-&lt;/TD&gt;
&lt;TD width="112"&gt;1-Oct-14&lt;/TD&gt;
&lt;TD width="112"&gt;72971041&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;41&lt;/TD&gt;
&lt;TD&gt;4615581&lt;/TD&gt;
&lt;TD&gt;74341618&lt;/TD&gt;
&lt;TD&gt;1-Nov-14&lt;/TD&gt;
&lt;TD width="62"&gt;FALSE&lt;/TD&gt;
&lt;TD width="110"&gt;1-Oct-14&lt;/TD&gt;
&lt;TD width="103"&gt;-&lt;/TD&gt;
&lt;TD width="112"&gt;1-Oct-14&lt;/TD&gt;
&lt;TD width="112"&gt;72971041&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;41&lt;/TD&gt;
&lt;TD&gt;8828883&lt;/TD&gt;
&lt;TD&gt;63829111&lt;/TD&gt;
&lt;TD&gt;1-Jul-15&lt;/TD&gt;
&lt;TD width="62"&gt;FALSE&lt;/TD&gt;
&lt;TD width="110"&gt;1-Oct-14&lt;/TD&gt;
&lt;TD width="103"&gt;-&lt;/TD&gt;
&lt;TD width="112"&gt;1-Oct-14&lt;/TD&gt;
&lt;TD width="112"&gt;72971041&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;9217&lt;/TD&gt;
&lt;TD&gt;9217&lt;/TD&gt;
&lt;TD&gt;21128775&lt;/TD&gt;
&lt;TD&gt;1-Jan-13&lt;/TD&gt;
&lt;TD width="62"&gt;TRUE&lt;/TD&gt;
&lt;TD width="110"&gt;1-Jan-13&lt;/TD&gt;
&lt;TD width="103"&gt;1-Mar-13&lt;/TD&gt;
&lt;TD width="112"&gt;1-Jan-13&lt;/TD&gt;
&lt;TD&gt;21128775&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;9217&lt;/TD&gt;
&lt;TD&gt;10124544&lt;/TD&gt;
&lt;TD&gt;15142897&lt;/TD&gt;
&lt;TD&gt;1-Jan-13&lt;/TD&gt;
&lt;TD width="62"&gt;FALSE&lt;/TD&gt;
&lt;TD width="110"&gt;1-Jan-13&lt;/TD&gt;
&lt;TD width="103"&gt;1-Mar-13&lt;/TD&gt;
&lt;TD&gt;1-Jan-13&lt;/TD&gt;
&lt;TD&gt;21128775&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;9217&lt;/TD&gt;
&lt;TD&gt;9217&lt;/TD&gt;
&lt;TD&gt;30874351&lt;/TD&gt;
&lt;TD&gt;1-Mar-13&lt;/TD&gt;
&lt;TD width="62"&gt;TRUE&lt;/TD&gt;
&lt;TD width="110"&gt;1-Mar-13&lt;/TD&gt;
&lt;TD width="103"&gt;1-Sep-14&lt;/TD&gt;
&lt;TD&gt;1-Mar-13&lt;/TD&gt;
&lt;TD&gt;30874351&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;9217&lt;/TD&gt;
&lt;TD&gt;9217&lt;/TD&gt;
&lt;TD&gt;71276102&lt;/TD&gt;
&lt;TD&gt;1-Sep-14&lt;/TD&gt;
&lt;TD width="62"&gt;TRUE&lt;/TD&gt;
&lt;TD width="110"&gt;1-Sep-14&lt;/TD&gt;
&lt;TD width="103"&gt;1-Nov-14&lt;/TD&gt;
&lt;TD&gt;1-Sep-14&lt;/TD&gt;
&lt;TD&gt;71276102&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;9217&lt;/TD&gt;
&lt;TD&gt;10124544&lt;/TD&gt;
&lt;TD&gt;74885982&lt;/TD&gt;
&lt;TD&gt;1-Nov-14&lt;/TD&gt;
&lt;TD width="62"&gt;FALSE&lt;/TD&gt;
&lt;TD width="110"&gt;1-Sep-14&lt;/TD&gt;
&lt;TD width="103"&gt;-&lt;/TD&gt;
&lt;TD&gt;1-Sep-14&lt;/TD&gt;
&lt;TD&gt;71276102&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;346372&lt;/TD&gt;
&lt;TD&gt;346372&lt;/TD&gt;
&lt;TD&gt;6478392&lt;/TD&gt;
&lt;TD&gt;1-Sep-14&lt;/TD&gt;
&lt;TD width="62"&gt;TRUE&lt;/TD&gt;
&lt;TD width="110"&gt;1-Sep-14&lt;/TD&gt;
&lt;TD width="103"&gt;1-Sep-14&lt;/TD&gt;
&lt;TD&gt;1-Sep-14&lt;/TD&gt;
&lt;TD&gt;6478392&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;7801669&lt;/TD&gt;
&lt;TD&gt;6368875&lt;/TD&gt;
&lt;TD&gt;2591876&lt;/TD&gt;
&lt;TD&gt;1-Dec-12&lt;/TD&gt;
&lt;TD width="62"&gt;FALSE&lt;/TD&gt;
&lt;TD width="110"&gt;-&lt;/TD&gt;
&lt;TD width="103"&gt;1-Jan-13&lt;/TD&gt;
&lt;TD&gt;1-Jan-13&lt;/TD&gt;
&lt;TD&gt;3829995&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;7801669&lt;/TD&gt;
&lt;TD&gt;7801669&lt;/TD&gt;
&lt;TD&gt;3829995&lt;/TD&gt;
&lt;TD&gt;1-Jan-13&lt;/TD&gt;
&lt;TD width="62"&gt;TRUE&lt;/TD&gt;
&lt;TD width="110"&gt;1-Jan-13&lt;/TD&gt;
&lt;TD width="103"&gt;1-Aug-15&lt;/TD&gt;
&lt;TD&gt;1-Jan-13&lt;/TD&gt;
&lt;TD&gt;3829995&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;7801669&lt;/TD&gt;
&lt;TD&gt;7801669&lt;/TD&gt;
&lt;TD&gt;97082679&lt;/TD&gt;
&lt;TD&gt;1-Aug-15&lt;/TD&gt;
&lt;TD width="62"&gt;TRUE&lt;/TD&gt;
&lt;TD width="110"&gt;1-Aug-15&lt;/TD&gt;
&lt;TD width="103"&gt;1-Nov-15&lt;/TD&gt;
&lt;TD&gt;1-Aug-15&lt;/TD&gt;
&lt;TD&gt;97082679&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;7801669&lt;/TD&gt;
&lt;TD&gt;6368875&lt;/TD&gt;
&lt;TD&gt;106930088&lt;/TD&gt;
&lt;TD&gt;1-Nov-15&lt;/TD&gt;
&lt;TD width="62"&gt;FALSE&lt;/TD&gt;
&lt;TD width="110"&gt;1-Nov-15&lt;/TD&gt;
&lt;TD width="103"&gt;1-Nov-15&lt;/TD&gt;
&lt;TD width="112"&gt;1-Nov-15&lt;/TD&gt;
&lt;TD&gt;107207912&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;7801669&lt;/TD&gt;
&lt;TD&gt;7801669&lt;/TD&gt;
&lt;TD&gt;107207912&lt;/TD&gt;
&lt;TD&gt;1-Nov-15&lt;/TD&gt;
&lt;TD width="62"&gt;TRUE&lt;/TD&gt;
&lt;TD width="110"&gt;1-Nov-15&lt;/TD&gt;
&lt;TD width="103"&gt;-&lt;/TD&gt;
&lt;TD&gt;1-Nov-15&lt;/TD&gt;
&lt;TD&gt;107207912&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;Thanks for the logic provided.&amp;nbsp;I tried it in SAS&amp;nbsp;but it's throwing CORRELATION errors.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;proc sql;&lt;BR /&gt; create table WANT as&lt;BR /&gt; select A.*,&lt;BR /&gt; B.VALID_DTTM as PREV_DTTM,&lt;BR /&gt; C.VALID_DTTM as NEXT_DTTM&lt;BR /&gt; from ONE A&lt;BR /&gt; left join (select * from ONE group by CURR_RK having CURR_RK=A.CURR_RK and VALID_DTTM &amp;lt; A.VALID_DTTM and VALID_DTTM=max(VALID_DTTM)) B&lt;BR /&gt; on A.CURR_RK=B.CURR_RK&lt;BR /&gt; left join (select * from ONE group by CURR_RK having CURR_RK=A.CURR_RK and VALID_DTTM &amp;gt; A.VALID_DTTM and VALID_DTTM=min(VALID_DTTM)) C&lt;BR /&gt; on A.CURR_RK=C.CURR_RK;&lt;BR /&gt;quit;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;SQL error:&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;ERROR: Correlated reference to column CURR_RK is not contained within a subquery.&lt;/STRONG&gt;&lt;BR /&gt;&lt;STRONG&gt;ERROR: Correlated reference to column VALID_DTTM is not contained within a subquery.&lt;/STRONG&gt;&lt;BR /&gt;&lt;STRONG&gt;ERROR: Correlated reference to column CURR_RK is not contained within a subquery.&lt;/STRONG&gt;&lt;BR /&gt;&lt;STRONG&gt;ERROR: Correlated reference to column VALID_DTTM is not contained within a subquery.&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;The query seems to be correct but I am not sure what is causing the issue.&amp;nbsp;&lt;/P&gt;
&lt;P&gt;I need to investigate and see if it gives me the desired new date variables.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Thanks once again.&lt;/P&gt;</description>
      <pubDate>Wed, 03 Aug 2016 12:14:30 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Procedures/Create-date-range-variables-by-comparing-current-observation/m-p/289178#M59619</guid>
      <dc:creator>ravib</dc:creator>
      <dc:date>2016-08-03T12:14:30Z</dc:date>
    </item>
    <item>
      <title>Re: Create date range variables by comparing current observation with previous and post observation</title>
      <link>https://communities.sas.com/t5/SAS-Procedures/Create-date-range-variables-by-comparing-current-observation/m-p/289190#M59620</link>
      <description>&lt;P&gt;Just re-jig a bit:&lt;/P&gt;
&lt;PRE&gt;proc sql;
  create table WANT as
  select  A.*,
          (select distinct VALID_DTTM from ONE group by CURR_RK having CURR_RK=A.CURR_RK and VALID_DTTM &amp;lt; A.VALID_DTTM and VALID_DTTM=max(VALID_DTTM)) as PREV_DTTM,
          (select distinct VALID_DTTM from ONE group by CURR_RK having CURR_RK=A.CURR_RK and VALID_DTTM &amp;gt; A.VALID_DTTM and VALID_DTTM=min(VALID_DTTM)) as NEXT_DTTM
  from    ONE A;
quit;&lt;/PRE&gt;</description>
      <pubDate>Wed, 03 Aug 2016 12:35:09 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Procedures/Create-date-range-variables-by-comparing-current-observation/m-p/289190#M59620</guid>
      <dc:creator>RW9</dc:creator>
      <dc:date>2016-08-03T12:35:09Z</dc:date>
    </item>
    <item>
      <title>Re: Create date range variables by comparing current observation with previous and post observation</title>
      <link>https://communities.sas.com/t5/SAS-Procedures/Create-date-range-variables-by-comparing-current-observation/m-p/289199#M59621</link>
      <description>&lt;P&gt;Hi Ksharp,&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Thank you very much for the solution logic provided. I am able to create new_sk &amp;amp; new_dttm with this logic but we found a small here is a small challenge to it. For e.g. if you observe last 3 records in below table, the 3rd record which is a matching record should get as is new_sk &amp;amp; new_dttm. Where as since 4th record is a non-match record, we need to verify its VALID_DTTM against pre-match record and also with post-match record values. In this case, the 5th record VALID_DTTM matches to the 4th record VALID_DTTM and hence we need to get its CUST_SK, VALID_DTTM and replace the values in the 4th record. Else it should pick the values from 3rd record (pre-matching record) irrespective of its VALID_DTTM values.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Because of this complexity, we&amp;nbsp;want to create two seperate date variables based on pre-match VALID_DTTM value and post-match VALID_DTTM value. Then take the min of them as&amp;nbsp;FINAL_DTTM. Accordingly replace the CUST_SK values for each record.&lt;/P&gt;
&lt;P&gt;They also want to use these dates in further jobs to implement some logic.&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;TABLE width="836"&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD width="71"&gt;&amp;nbsp;CURR_RK&lt;/TD&gt;
&lt;TD width="64"&gt;ORIG_RK&lt;/TD&gt;
&lt;TD width="70"&gt;CUST_SK&lt;/TD&gt;
&lt;TD width="89"&gt;VALID_DTTM&lt;/TD&gt;
&lt;TD width="85"&gt;VALID_END_DTTM&lt;/TD&gt;
&lt;TD width="40"&gt;FLAG&lt;/TD&gt;
&lt;TD width="103"&gt;MAX_DT_BFOR_VALID_DTTM&lt;/TD&gt;
&lt;TD width="97"&gt;MIN_DT_AFTR_VALID_DTTM&lt;/TD&gt;
&lt;TD width="112"&gt;EXPECTED FINAL VALID_DTTM&lt;/TD&gt;
&lt;TD width="105"&gt;EXPECTED FINAL CUST_SK&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;7801669&lt;/TD&gt;
&lt;TD&gt;6368875&lt;/TD&gt;
&lt;TD&gt;2591876&lt;/TD&gt;
&lt;TD&gt;1-Dec-12&lt;/TD&gt;
&lt;TD width="85"&gt;31-Oct-15&lt;/TD&gt;
&lt;TD width="40"&gt;FALSE&lt;/TD&gt;
&lt;TD width="103"&gt;-&lt;/TD&gt;
&lt;TD width="97"&gt;1-Jan-13&lt;/TD&gt;
&lt;TD&gt;1-Jan-13&lt;/TD&gt;
&lt;TD&gt;3829995&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;7801669&lt;/TD&gt;
&lt;TD&gt;7801669&lt;/TD&gt;
&lt;TD&gt;3829995&lt;/TD&gt;
&lt;TD&gt;1-Jan-13&lt;/TD&gt;
&lt;TD width="85"&gt;31-Jul-15&lt;/TD&gt;
&lt;TD width="40"&gt;TRUE&lt;/TD&gt;
&lt;TD width="103"&gt;1-Jan-13&lt;/TD&gt;
&lt;TD width="97"&gt;1-Aug-15&lt;/TD&gt;
&lt;TD&gt;1-Jan-13&lt;/TD&gt;
&lt;TD&gt;3829995&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;7801669&lt;/TD&gt;
&lt;TD&gt;7801669&lt;/TD&gt;
&lt;TD&gt;97082679&lt;/TD&gt;
&lt;TD&gt;1-Aug-15&lt;/TD&gt;
&lt;TD width="85"&gt;31-Oct-15&lt;/TD&gt;
&lt;TD width="40"&gt;TRUE&lt;/TD&gt;
&lt;TD width="103"&gt;1-Aug-15&lt;/TD&gt;
&lt;TD width="97"&gt;1-Nov-15&lt;/TD&gt;
&lt;TD&gt;1-Aug-15&lt;/TD&gt;
&lt;TD&gt;97082679&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;7801669&lt;/TD&gt;
&lt;TD&gt;6368875&lt;/TD&gt;
&lt;TD&gt;106930088&lt;/TD&gt;
&lt;TD&gt;1-Nov-15&lt;/TD&gt;
&lt;TD width="85"&gt;31-Dec-47&lt;/TD&gt;
&lt;TD width="40"&gt;FALSE&lt;/TD&gt;
&lt;TD width="103"&gt;1-Nov-15&lt;/TD&gt;
&lt;TD width="97"&gt;1-Nov-15&lt;/TD&gt;
&lt;TD width="112"&gt;1-Nov-15&lt;/TD&gt;
&lt;TD&gt;107207912&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;7801669&lt;/TD&gt;
&lt;TD&gt;7801669&lt;/TD&gt;
&lt;TD&gt;107207912&lt;/TD&gt;
&lt;TD&gt;1-Nov-15&lt;/TD&gt;
&lt;TD width="85"&gt;31-Dec-47&lt;/TD&gt;
&lt;TD width="40"&gt;TRUE&lt;/TD&gt;
&lt;TD width="103"&gt;1-Nov-15&lt;/TD&gt;
&lt;TD width="97"&gt;-&lt;/TD&gt;
&lt;TD&gt;1-Nov-15&lt;/TD&gt;
&lt;TD&gt;107207912&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;Hope I am able to explain well. Please help if you have any alternative solution for this.&lt;/P&gt;
&lt;P&gt;Thank you in advance.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Wed, 03 Aug 2016 13:04:00 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Procedures/Create-date-range-variables-by-comparing-current-observation/m-p/289199#M59621</guid>
      <dc:creator>ravib</dc:creator>
      <dc:date>2016-08-03T13:04:00Z</dc:date>
    </item>
    <item>
      <title>Re: Create date range variables by comparing current observation with previous and post observation</title>
      <link>https://communities.sas.com/t5/SAS-Procedures/Create-date-range-variables-by-comparing-current-observation/m-p/289470#M59642</link>
      <description>&lt;P&gt;Hi Ksharp,&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;I tried to execute the sas code you have given (using Hash object) through DI Studio on our UAT environment but it is failing:&lt;/P&gt;
&lt;P&gt;&lt;FONT color="#FF0000"&gt;ERROR: &amp;nbsp;Hash object added 85983216 items when memory failure occured&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color="#FF0000"&gt;FATAL : Insufficient memory to execute DATA&amp;nbsp;step program. Aborted during the EXECUTION phase.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color="#FF0000"&gt;ERROR: The SAS system stopped processing this step because of insufficient memory.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;My Input table is having &lt;STRONG&gt;112937794&lt;/STRONG&gt; observations and hence HASH object process is causing the failure.&lt;/P&gt;
&lt;P&gt;I verified my "xmrlmem" option and it is currently set to &lt;STRONG&gt;6442450944.&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;I am not getting any other option handle this issue.&amp;nbsp;&lt;SPAN style="line-height: 20px;"&gt;Do you have any suggestions?&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Thu, 04 Aug 2016 09:23:25 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Procedures/Create-date-range-variables-by-comparing-current-observation/m-p/289470#M59642</guid>
      <dc:creator>ravib</dc:creator>
      <dc:date>2016-08-04T09:23:25Z</dc:date>
    </item>
    <item>
      <title>Re: Create date range variables by comparing current observation with previous and post observation</title>
      <link>https://communities.sas.com/t5/SAS-Procedures/Create-date-range-variables-by-comparing-current-observation/m-p/289474#M59643</link>
      <description>&lt;PRE&gt;
So you want the nearest  date no matter it PRE date or POST date?
But if PRE and POST have the same different days like below , which one you gonna to pick ?

7801669	7801669	97082679	1-Nov-15	
7801669	6368875	106930088	1-Nov-15	
7801669	7801669	107207912	1-Nov-15 


Assuming both either you could accept :


data one;
infile datalines expandtabs truncover;
input CURR_RK ORIG_RK CUST_SK VALID_DTTM: anydtdte10. ;
format VALID_DTTM date9.;
datalines;
41 2673 2342321 1-Sep-12
41 41 12559928 1-Jan-13
41 4615581 14452649 1-Feb-13
41 4615581 67316104 1-Aug-14
41 41 72971041 1-Oct-14
41 4615581 74341618 1-Nov-14
41 8828883 63829111 1-Jul-15
9217 9217 21128775 1-Jan-13
9217 10124544 15142897 1-Jan-13
9217 9217 30874351 1-Mar-13
9217 9217 71276102 1-Sep-14
9217 10124544 74885982 1-Nov-14
346372 346372 6478392 1-Sep-14
7801669	6368875	2591876	1-Dec-12
7801669	7801669	3829995	1-Jan-13
7801669	7801669	97082679 1-Aug-15
7801669	6368875	106930088 1-Nov-15
7801669	7801669	107207912 1-Nov-15
;
run;

proc sql;
create table key as
 select *,max(VALID_DTTM) as max_date,min(VALID_DTTM) as min_date
  from one
   group by curr_rk
    order by curr_rk,valid_dttm;
quit;

data want;
 if _n_=1 then do;
  if 0 then set key(rename=(CUST_SK=new_sk VALID_DTTM=new_dt));
  declare hash h1(dataset:'one(rename=(CUST_SK=new_sk VALID_DTTM=new_dt)
   where=(CURR_RK=ORIG_RK))');
  h1.definekey('CURR_RK','new_dt');
  h1.definedata('new_sk','new_dt');
  h1.definedone();
 end;
set key;
dif=99999;
do i=min_date to max_date;
 call missing(new_sk,new_dt);
 rc=h1.find(key:CURR_RK,key:i);
 if rc=0 then do;
  abs=abs(VALID_DTTM-new_dt);
  if abs&lt;DIF then="" do=""&gt;&lt;/DIF&gt;&lt;/PRE&gt;</description>
      <pubDate>Thu, 04 Aug 2016 09:48:27 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Procedures/Create-date-range-variables-by-comparing-current-observation/m-p/289474#M59643</guid>
      <dc:creator>Ksharp</dc:creator>
      <dc:date>2016-08-04T09:48:27Z</dc:date>
    </item>
    <item>
      <title>Re: Create date range variables by comparing current observation with previous and post observation</title>
      <link>https://communities.sas.com/t5/SAS-Procedures/Create-date-range-variables-by-comparing-current-observation/m-p/289475#M59644</link>
      <description>&lt;P&gt;Hi,&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;In such case, I should pick the 1st record values and place it into the 2nd record.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;7801669 7801669 97082679 1-Nov-15&amp;nbsp;&lt;BR /&gt;7801669 6368875 106930088 1-Nov-15 &lt;BR /&gt;7801669 7801669 107207912 1-Nov-15&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;FONT color="#ff0000"&gt;New data would be:&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;7801669 7801669 97082679 1-Nov-15 &lt;BR /&gt;7801669 6368875 97082679 1-Nov-15 &lt;BR /&gt;7801669 7801669 107207912 1-Nov-15&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Anyway, the previous program you have sent is working fine now as I sorted the data with matching flag now.&lt;/P&gt;
&lt;P&gt;The new problem I am facing is the HASH object execution failure due to insufficient memory in Work.&lt;/P&gt;
&lt;P&gt;Can I&amp;nbsp;push this entire code&amp;nbsp;onto Oracle database processing? Will Hash programs work on Oracle using SQL pass through?&lt;/P&gt;</description>
      <pubDate>Thu, 04 Aug 2016 10:08:57 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Procedures/Create-date-range-variables-by-comparing-current-observation/m-p/289475#M59644</guid>
      <dc:creator>ravib</dc:creator>
      <dc:date>2016-08-04T10:08:57Z</dc:date>
    </item>
    <item>
      <title>Re: Create date range variables by comparing current observation with previous and post observation</title>
      <link>https://communities.sas.com/t5/SAS-Procedures/Create-date-range-variables-by-comparing-current-observation/m-p/289478#M59647</link>
      <description>&lt;PRE&gt;
OK. Use DOW skill. But you still don't answer my question yet ?



data one;
infile datalines expandtabs truncover;
input CURR_RK ORIG_RK CUST_SK VALID_DTTM: anydtdte10. ;
format VALID_DTTM date9.;
datalines;
41 2673 2342321 1-Sep-12
41 41 12559928 1-Jan-13
41 4615581 14452649 1-Feb-13
41 4615581 67316104 1-Aug-14
41 41 72971041 1-Oct-14
41 4615581 74341618 1-Nov-14
41 8828883 63829111 1-Jul-15
9217 9217 21128775 1-Jan-13
9217 10124544 15142897 1-Jan-13
9217 9217 30874351 1-Mar-13
9217 9217 71276102 1-Sep-14
9217 10124544 74885982 1-Nov-14
346372 346372 6478392 1-Sep-14
7801669	6368875	2591876	1-Dec-12
7801669	7801669	3829995	1-Jan-13
7801669	7801669	97082679 1-Aug-15
7801669	6368875	106930088 1-Nov-15
7801669	7801669	107207912 1-Nov-15
;
run;

proc sql;
create table key as
 select *,max(VALID_DTTM) as max_date,min(VALID_DTTM) as min_date
  from one
   group by curr_rk
    order by curr_rk,valid_dttm;
quit;

data want;
 if _n_=1 then do;
  if 0 then set key(rename=(CUST_SK=new_sk VALID_DTTM=new_dt));
  declare hash h1(hashexp:20);
  h1.definekey('CURR_RK','new_dt');
  h1.definedata('new_sk','new_dt');
  h1.definedone();
 end;

do until(last.curr_rk);
 set key;
 by curr_rk;
 if CURR_RK=ORIG_RK then do;
  new_sk=CUST_SK; new_dt=VALID_DTTM; rc=h1.add();
 end;
end;

do until(last.curr_rk);
 set key;
 by curr_rk;
dif=99999;
do i=min_date to max_date;
 call missing(new_sk,new_dt);
 rc=h1.find(key:CURR_RK,key:i);
 if rc=0 then do;
  abs=abs(VALID_DTTM-new_dt);
  if abs&lt;DIF then="" do=""&gt;&lt;/DIF&gt;&lt;/PRE&gt;</description>
      <pubDate>Thu, 04 Aug 2016 10:30:10 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Procedures/Create-date-range-variables-by-comparing-current-observation/m-p/289478#M59647</guid>
      <dc:creator>Ksharp</dc:creator>
      <dc:date>2016-08-04T10:30:10Z</dc:date>
    </item>
    <item>
      <title>Re: Create date range variables by comparing current observation with previous and post observation</title>
      <link>https://communities.sas.com/t5/SAS-Procedures/Create-date-range-variables-by-comparing-current-observation/m-p/289479#M59648</link>
      <description>&lt;PRE&gt;
My code has been truncated and I can't delete it . Try this one .


data one;
infile datalines expandtabs truncover;
input CURR_RK ORIG_RK CUST_SK VALID_DTTM: anydtdte10. ;
format VALID_DTTM date9.;
datalines;
41 2673 2342321 1-Sep-12
41 41 12559928 1-Jan-13
41 4615581 14452649 1-Feb-13
41 4615581 67316104 1-Aug-14
41 41 72971041 1-Oct-14
41 4615581 74341618 1-Nov-14
41 8828883 63829111 1-Jul-15
9217 9217 21128775 1-Jan-13
9217 10124544 15142897 1-Jan-13
9217 9217 30874351 1-Mar-13
9217 9217 71276102 1-Sep-14
9217 10124544 74885982 1-Nov-14
346372 346372 6478392 1-Sep-14
7801669	6368875	2591876	1-Dec-12
7801669	7801669	3829995	1-Jan-13
7801669	7801669	97082679 1-Aug-15
7801669	6368875	106930088 1-Nov-15
7801669	7801669	107207912 1-Nov-15
;
run;

proc sql;
create table key as
 select *,max(VALID_DTTM) as max_date,min(VALID_DTTM) as min_date
  from one
   group by curr_rk
    order by curr_rk,valid_dttm;
quit;

data want;
 if _n_=1 then do;
  if 0 then set key(rename=(CUST_SK=new_sk VALID_DTTM=new_dt));
  declare hash h1(hashexp:20);
  h1.definekey('CURR_RK','new_dt');
  h1.definedata('new_sk','new_dt');
  h1.definedone();
 end;

do until(last.curr_rk);
 set key;
 by curr_rk;
 if CURR_RK=ORIG_RK then do;
  new_sk=CUST_SK; new_dt=VALID_DTTM; rc=h1.add();
 end;
end;

do until(last.curr_rk);
 set key;
 by curr_rk;
dif=99999;
do i=min_date to max_date;
 call missing(new_sk,new_dt);
 rc=h1.find(key:CURR_RK,key:i);
 if rc=0 then do;
  abs=abs(VALID_DTTM-new_dt);
  if abs lt dif then do;
   dif=abs;want_sk=new_sk;want_dt=new_dt;
  end;
 end;
end;
output;
end;

h1.clear();
format want_dt date9.;
drop rc dif i min_date max_date abs new_sk new_dt;
run;


&lt;/PRE&gt;</description>
      <pubDate>Thu, 04 Aug 2016 10:33:08 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Procedures/Create-date-range-variables-by-comparing-current-observation/m-p/289479#M59648</guid>
      <dc:creator>Ksharp</dc:creator>
      <dc:date>2016-08-04T10:33:08Z</dc:date>
    </item>
    <item>
      <title>Re: Create date range variables by comparing current observation with previous and post observation</title>
      <link>https://communities.sas.com/t5/SAS-Procedures/Create-date-range-variables-by-comparing-current-observation/m-p/289482#M59650</link>
      <description>&lt;PRE&gt;
And One more question, If data like this what you gonna do ?

7801669	7801669	97082679	1-Nov-15	
7801669	6368875	106930088	2-Nov-15	
7801669	7801669	107207912	3-Nov-15 


&lt;/PRE&gt;</description>
      <pubDate>Thu, 04 Aug 2016 10:35:28 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Procedures/Create-date-range-variables-by-comparing-current-observation/m-p/289482#M59650</guid>
      <dc:creator>Ksharp</dc:creator>
      <dc:date>2016-08-04T10:35:28Z</dc:date>
    </item>
    <item>
      <title>Re: Create date range variables by comparing current observation with previous and post observation</title>
      <link>https://communities.sas.com/t5/SAS-Procedures/Create-date-range-variables-by-comparing-current-observation/m-p/289484#M59651</link>
      <description>&lt;P&gt;Hi,&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;If this is the data:&lt;/P&gt;
&lt;P&gt;7801669 7801669 97082679 1-Nov-15 &lt;BR /&gt;7801669 6368875 106930088 2-Nov-15 &lt;BR /&gt;7801669 7801669 107207912 3-Nov-15&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Since the 2nd record&amp;nbsp;has one&amp;nbsp;pre-match and one post-match consecutively, the minimum value of both their dates will be taken i.e. in this case 1-Nov-2015.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Expected Result would be:&lt;/P&gt;
&lt;P&gt;7801669 7801669 97082679 1-Nov-15 &lt;BR /&gt;7801669 6368875 &lt;FONT color="#ff0000"&gt;97082679 1-Nov-15&lt;/FONT&gt; &lt;BR /&gt;7801669 7801669 107207912 3-Nov-15&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Thu, 04 Aug 2016 10:41:54 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Procedures/Create-date-range-variables-by-comparing-current-observation/m-p/289484#M59651</guid>
      <dc:creator>ravib</dc:creator>
      <dc:date>2016-08-04T10:41:54Z</dc:date>
    </item>
    <item>
      <title>Re: Create date range variables by comparing current observation with previous and post observation</title>
      <link>https://communities.sas.com/t5/SAS-Procedures/Create-date-range-variables-by-comparing-current-observation/m-p/289486#M59652</link>
      <description>OK. My code can handle this .</description>
      <pubDate>Thu, 04 Aug 2016 10:53:49 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Procedures/Create-date-range-variables-by-comparing-current-observation/m-p/289486#M59652</guid>
      <dc:creator>Ksharp</dc:creator>
      <dc:date>2016-08-04T10:53:49Z</dc:date>
    </item>
    <item>
      <title>Re: Create date range variables by comparing current observation with previous and post observation</title>
      <link>https://communities.sas.com/t5/SAS-Procedures/Create-date-range-variables-by-comparing-current-observation/m-p/289488#M59654</link>
      <description>OK. My code can handle this . And I found a problem in my code. Try this one :
&lt;PRE&gt;


data one;
infile datalines expandtabs truncover;
input CURR_RK ORIG_RK CUST_SK VALID_DTTM: anydtdte10. ;
format VALID_DTTM date9.;
datalines;
41 2673 2342321 1-Sep-12
41 41 12559928 1-Jan-13
41 4615581 14452649 1-Feb-13
41 4615581 67316104 1-Aug-14
41 41 72971041 1-Oct-14
41 4615581 74341618 1-Nov-14
41 8828883 63829111 1-Jul-15
9217 9217 21128775 1-Jan-13
9217 10124544 15142897 1-Jan-13
9217 9217 30874351 1-Mar-13
9217 9217 71276102 1-Sep-14
9217 10124544 74885982 1-Nov-14
346372 346372 6478392 1-Sep-14
7801669	6368875	2591876	1-Dec-12
7801669	7801669	3829995	1-Jan-13
7801669	7801669	97082679 1-Nov-15
7801669	6368875	106930088 2-Nov-15
7801669	7801669	107207912 3-Nov-15
;
run;

proc sql;
create table key as
 select *,max(VALID_DTTM) as max_date,min(VALID_DTTM) as min_date
  from one
   group by curr_rk
    order by curr_rk,valid_dttm;
quit;

data want;
 if _n_=1 then do;
  if 0 then set key(rename=(CUST_SK=new_sk VALID_DTTM=new_dt));
  declare hash h1(hashexp:20);
  h1.definekey('CURR_RK','new_dt');
  h1.definedata('new_sk','new_dt');
  h1.definedone();
 end;

do until(last.curr_rk);
 set key;
 by curr_rk;
 if CURR_RK=ORIG_RK then do;
  new_sk=CUST_SK; new_dt=VALID_DTTM; rc=h1.add();
 end;
end;

do until(last.curr_rk);
 set key;
 by curr_rk;
if CURR_RK=ORIG_RK then do;want_sk=CUST_SK;want_dt=VALID_DTTM; end;

else do;
dif=99999;
do i=min_date to max_date;
 call missing(new_sk,new_dt);
 rc=h1.find(key:CURR_RK,key:i);
 if rc=0 then do;
  abs=abs(VALID_DTTM-new_dt);
  if abs lt dif then do;
   dif=abs;want_sk=new_sk;want_dt=new_dt;
  end;
 end;
end;
end;

output;
end;

h1.clear();
format want_dt date9.;
drop rc dif i min_date max_date abs new_sk new_dt;
run;
&lt;/PRE&gt;</description>
      <pubDate>Thu, 04 Aug 2016 11:02:26 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Procedures/Create-date-range-variables-by-comparing-current-observation/m-p/289488#M59654</guid>
      <dc:creator>Ksharp</dc:creator>
      <dc:date>2016-08-04T11:02:26Z</dc:date>
    </item>
    <item>
      <title>Re: Create date range variables by comparing current observation with previous and post observation</title>
      <link>https://communities.sas.com/t5/SAS-Procedures/Create-date-range-variables-by-comparing-current-observation/m-p/289489#M59655</link>
      <description>&lt;PRE&gt;
You need test code on your own. There are too many scenarios need to be consider . Like :
what you gonna do ?

7801669	7801669	97082679	1-Nov-15	
7801669	7801669	77082680	1-Nov-15	
7801669	6368875	106930088	1-Nov-15	 &amp;lt;---------
7801669	7801669	22207912	1-Nov-15 
7801669	7801669	107207912	1-Nov-15 

&lt;/PRE&gt;</description>
      <pubDate>Thu, 04 Aug 2016 11:08:55 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Procedures/Create-date-range-variables-by-comparing-current-observation/m-p/289489#M59655</guid>
      <dc:creator>Ksharp</dc:creator>
      <dc:date>2016-08-04T11:08:55Z</dc:date>
    </item>
  </channel>
</rss>

