<?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: New user here with a FIRST.var &amp; LAST.var question in SAS Procedures</title>
    <link>https://communities.sas.com/t5/SAS-Procedures/New-user-here-with-a-FIRST-var-LAST-var-question/m-p/207004#M51426</link>
    <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Being a bit pedantic I would say records where the key is duplicated, not duplicate records. &lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
    <pubDate>Fri, 20 Mar 2015 22:43:08 GMT</pubDate>
    <dc:creator>ballardw</dc:creator>
    <dc:date>2015-03-20T22:43:08Z</dc:date>
    <item>
      <title>New user here with a FIRST.var &amp; LAST.var question</title>
      <link>https://communities.sas.com/t5/SAS-Procedures/New-user-here-with-a-FIRST-var-LAST-var-question/m-p/207001#M51423</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;I've got SAS code that extracts data from a Peoplesoft environment (Oracle).&amp;nbsp; It was written years ago and I have to decipher it without any documentation, and move it into a Peoplecode Application Engine using SQL steps.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;One piece of code clearly shows the developer finding duplicates using the following key.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;STDNT_KEY = EMPLID || STRM || CLASS_NBR;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;DATA DUPS_CDUP_ENRL;&lt;/P&gt;&lt;P&gt;SET CLS_CDUP_ENRL;&lt;/P&gt;&lt;P&gt;BY STDNT_KEY;&lt;/P&gt;&lt;P&gt;IF (FIRST.STDNT_KEY = 1 &amp;amp; LAST.STDNT_KEY = 0) OR&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; (FIRST.STDNT_KEY = 0 &amp;amp; LAST.STDNT_KEY = 0) OR&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; (FIRST.STDNT_KEY = 0 &amp;amp; LAST.STDNT_KEY = 1);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; KEEP OWNER EMPLID STRM SESSION_CODE SUBJECT CATALOG_NBR CLASS_SECTION DUP_CODE;&lt;/P&gt;&lt;P&gt;RUN;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;PROC EXPORT DATA=DUPS_CDUP_ENRL&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; OUTFILE= "C:\Processes\C_DUP\for_1058\DUPLICATE_CDUP_ENTRIES.xls" &lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DBMS=EXCEL2000 REPLACE;&lt;/P&gt;&lt;P&gt;RUN;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;In my understanding if FIRST.STDNT_KEY = 1 &amp;amp; LAST.STDNT_KEY = 1&amp;nbsp; then he would not have any duplicates, so he appears to only look for any row that is a duplicate.&amp;nbsp; True?&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Again...I have no business rules or documentation so I have to try and understand the intent of the developer via the code.&lt;/P&gt;&lt;P&gt;Later I see the following code...&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;IF (FIRST.STDNT_KEY = 0 &amp;amp; LAST.STDNT_KEY = 0) OR&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; (FIRST.STDNT_KEY = 0 &amp;amp; LAST.STDNT_KEY = 1) THEN DELETE;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;OUTPUT CDUP_TRANS;&lt;/P&gt;&lt;P&gt;RUN;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;PROC EXPORT DATA=CDUP_TRANS&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; OUTFILE= "C:\Processes\C_DUP\for_1058\CDUP_TRANS.xls" &lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DBMS=EXCEL2000 REPLACE;&lt;/P&gt;&lt;P&gt;RUN;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;I don't know what CDUP_TRANS output is supposed to represent and don't know&amp;nbsp; if the developer was only looking for dups STDNT_KEY = 1 for both first and last.&amp;nbsp; If so why did they exclude (FIRST.STDNT_KEY = 1 &amp;amp; LAST.STDNT_KEY = 0) from the CDUP_TRANS code?&amp;nbsp; &lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Is&lt;/P&gt;&lt;P&gt;(FIRST.STDNT_KEY = 1 &amp;amp; LAST.STDNT_KEY = 0) OR&lt;/P&gt;&lt;P&gt;(FIRST.STDNT_KEY = 0 &amp;amp; LAST.STDNT_KEY = 1)&lt;/P&gt;&lt;P&gt;redundant?&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Fri, 20 Mar 2015 20:30:01 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Procedures/New-user-here-with-a-FIRST-var-LAST-var-question/m-p/207001#M51423</guid>
      <dc:creator>SFDonovan</dc:creator>
      <dc:date>2015-03-20T20:30:01Z</dc:date>
    </item>
    <item>
      <title>Re: New user here with a FIRST.var &amp; LAST.var question</title>
      <link>https://communities.sas.com/t5/SAS-Procedures/New-user-here-with-a-FIRST-var-LAST-var-question/m-p/207002#M51424</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;PRE _modifiedtitle="true" class="jive_text_macro jive_macro_quote"&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;In my understanding if FIRST.STDNT_KEY = 1 &amp;amp; LAST.STDNT_KEY = 1&amp;nbsp; then he would not have any duplicates, so he appears to only look for any row that is a duplicate.&amp;nbsp; True?&lt;/P&gt;



&lt;/PRE&gt;&lt;P&gt;&lt;SPAN style="color: #ff0000;"&gt;That is true he is keeping STDNT's data who have more than one entries.&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;PRE _modifiedtitle="true" class="jive_text_macro jive_macro_quote"&gt;&lt;BR /&gt;
&lt;P&gt;I don't know what CDUP_TRANS output is supposed to represent and don't know&amp;nbsp; if the developer was only looking for dups STDNT_KEY = 1 for both first and last.&amp;nbsp; If so why did they exclude (FIRST.STDNT_KEY = 1 &amp;amp; LAST.STDNT_KEY = 0) from the CDUP_TRANS code?&lt;/P&gt;



&lt;/PRE&gt;&lt;P&gt;&lt;SPAN style="color: #ff0000;"&gt;In this code he summarize each from those who have more than one entries, representing them by the first entry only. For summarize or reporting...&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="color: #ff0000;"&gt;But your code's first part is not complete. So it could be that he is report all the STDNT in the database table without duplicate. So the STDNT with more than one entries will be represented by the first record and those who has one entries will also be represented.&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;PRE _modifiedtitle="true" class="jive_text_macro jive_macro_quote"&gt;Is
&lt;P&gt;(FIRST.STDNT_KEY = 1 &amp;amp; LAST.STDNT_KEY = 0) OR&lt;/P&gt;
&lt;P&gt;(FIRST.STDNT_KEY = 0 &amp;amp; LAST.STDNT_KEY = 1)&lt;/P&gt;
&lt;P&gt;redundant?&lt;/P&gt;



&lt;/PRE&gt;&lt;P&gt;&lt;SPAN style="color: #ff0000;"&gt;No,&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="color: #ff0000;"&gt;(FIRST.STDNT_KEY = 1 &amp;amp; LAST.STDNT_KEY = 0) ... mean the first entry in the group&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="color: #ff0000;"&gt;(FIRST.STDNT_KEY = 0 &amp;amp; LAST.STDNT_KEY = 1) ... mean the last entry in the group&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;*****&lt;/P&gt;&lt;P&gt;For example:&lt;/P&gt;&lt;P&gt;STDNT_KEY&lt;/P&gt;&lt;P&gt;1&lt;/P&gt;&lt;P&gt;2&lt;/P&gt;&lt;P&gt;3&lt;/P&gt;&lt;P&gt;1&lt;/P&gt;&lt;P&gt;1&lt;/P&gt;&lt;P&gt;3&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;After the data sorted by STDNT_KEY:&lt;/P&gt;&lt;P&gt;STDNT_KEY&lt;/P&gt;&lt;P&gt;1&lt;/P&gt;&lt;P&gt;1&lt;/P&gt;&lt;P&gt;1&lt;/P&gt;&lt;P&gt;2&lt;/P&gt;&lt;P&gt;3&lt;/P&gt;&lt;P&gt;3&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;By understanding the first and last temporary SAS variables in the sorted data, and understanding that each unique student entries is a group in it's self:&lt;/P&gt;&lt;P&gt;STDNT_KEY&lt;/P&gt;&lt;P&gt;1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (FIRST.STDNT_KEY = 1 &amp;amp; LAST.STDNT_KEY = 0) ... the first entry in the 1's group&lt;/P&gt;&lt;P&gt;1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (FIRST.STDNT_KEY = 0 &amp;amp; LAST.STDNT_KEY = 0) ... not the first or the last&lt;/P&gt;&lt;P&gt;1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (FIRST.STDNT_KEY = 0 &amp;amp; LAST.STDNT_KEY = 1) ... the last entry in the 1's group&lt;/P&gt;&lt;P&gt;2&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (FIRST.STDNT_KEY = 1 &amp;amp; LAST.STDNT_KEY = 1) ... the first entry in the 2's group and the last&lt;/P&gt;&lt;P&gt;3&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (FIRST.STDNT_KEY = 1 &amp;amp; LAST.STDNT_KEY = 0) ... the first entry in the 3's group&lt;/P&gt;&lt;P&gt;3&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (FIRST.STDNT_KEY = 0 &amp;amp; LAST.STDNT_KEY = 1) ... the last entry in the 3's group&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;*********&lt;/P&gt;&lt;P&gt;So&lt;/P&gt;&lt;P&gt;IF (FIRST.STDNT_KEY = 1 &lt;STRONG&gt;&amp;amp;&lt;/STRONG&gt; LAST.STDNT_KEY = 0) &lt;STRONG&gt;OR&lt;/STRONG&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; (FIRST.STDNT_KEY = 0 &lt;STRONG&gt;&amp;amp;&lt;/STRONG&gt; LAST.STDNT_KEY = 0) &lt;STRONG&gt;OR&lt;/STRONG&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; (FIRST.STDNT_KEY = 0 &lt;STRONG&gt;&amp;amp;&lt;/STRONG&gt; LAST.STDNT_KEY = 1) THEN OUTPUT;&lt;/P&gt;&lt;P&gt;gives you&lt;/P&gt;&lt;P&gt;STDNT_KEY&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (FIRST.STDNT_KEY = 1 &amp;amp; LAST.STDNT_KEY = 0) ... the first entry in the 1's group&lt;/STRONG&gt;&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (FIRST.STDNT_KEY = 0 &amp;amp; LAST.STDNT_KEY = 0) &lt;/STRONG&gt;&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (FIRST.STDNT_KEY = 0 &amp;amp; LAST.STDNT_KEY = 1) ... the last entry in the 1's group&lt;/STRONG&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="text-decoration: line-through;"&gt;2&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (FIRST.STDNT_KEY = 1 &amp;amp; LAST.STDNT_KEY = 1) ... the first entry in the 2's group and the last&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;3&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (FIRST.STDNT_KEY = 1 &amp;amp; LAST.STDNT_KEY = 0) ... the first entry in the 3's group&lt;/STRONG&gt;&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;3&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (FIRST.STDNT_KEY = 0 &amp;amp; LAST.STDNT_KEY = 1) ... the last entry in the 3's group&lt;/STRONG&gt;&lt;/P&gt;&lt;P&gt;&lt;EM&gt;&lt;STRONG&gt;&lt;BR /&gt;&lt;/STRONG&gt;&lt;/EM&gt;&lt;/P&gt;&lt;P&gt;&lt;EM&gt;&lt;STRONG&gt;*******&lt;BR /&gt;&lt;/STRONG&gt;&lt;/EM&gt;&lt;/P&gt;&lt;P&gt;And&lt;/P&gt;&lt;P&gt;IF (FIRST.STDNT_KEY = 0 &lt;STRONG&gt;&amp;amp;&lt;/STRONG&gt; LAST.STDNT_KEY = 0) &lt;STRONG&gt;OR&lt;/STRONG&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; (FIRST.STDNT_KEY = 0 &lt;STRONG&gt;&amp;amp;&lt;/STRONG&gt; LAST.STDNT_KEY = 1) THEN DELETE;;&lt;/P&gt;&lt;P&gt;gives you:&lt;/P&gt;&lt;P&gt;STDNT_KEY&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (FIRST.STDNT_KEY = 1 &amp;amp; LAST.STDNT_KEY = 0) ... the first entry in the 1's group&lt;/STRONG&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="text-decoration: line-through;"&gt;1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (FIRST.STDNT_KEY = 0 &amp;amp; LAST.STDNT_KEY = 0) &lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="text-decoration: line-through;"&gt;1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (FIRST.STDNT_KEY = 0 &amp;amp; LAST.STDNT_KEY = 1) ... the last entry in the 1's group&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;2&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (FIRST.STDNT_KEY = 1 &amp;amp; LAST.STDNT_KEY = 1) ... the first entry in the 2's group and the last&lt;/STRONG&gt;&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;3&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (FIRST.STDNT_KEY = 1 &amp;amp; LAST.STDNT_KEY = 0) ... the first entry in the 3's group&lt;/STRONG&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="text-decoration: line-through;"&gt;3&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (FIRST.STDNT_KEY = 0 &amp;amp; LAST.STDNT_KEY = 1) ... the last entry in the 3's group&lt;/SPAN&gt;&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Fri, 20 Mar 2015 21:40:24 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Procedures/New-user-here-with-a-FIRST-var-LAST-var-question/m-p/207002#M51424</guid>
      <dc:creator>mohamed_zaki</dc:creator>
      <dc:date>2015-03-20T21:40:24Z</dc:date>
    </item>
    <item>
      <title>Re: New user here with a FIRST.var &amp; LAST.var question</title>
      <link>https://communities.sas.com/t5/SAS-Procedures/New-user-here-with-a-FIRST-var-LAST-var-question/m-p/207003#M51425</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hi.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;How about you try this:&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;IF FIRST.STDNT_KEY = 1 and LAST.STDNT_KEY = 1 then delete;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else output;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;this way - records that are unique (first and last = 1) are deleted from the data table and only the duplicate records are kept.&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Fri, 20 Mar 2015 22:09:19 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Procedures/New-user-here-with-a-FIRST-var-LAST-var-question/m-p/207003#M51425</guid>
      <dc:creator>OS2Rules</dc:creator>
      <dc:date>2015-03-20T22:09:19Z</dc:date>
    </item>
    <item>
      <title>Re: New user here with a FIRST.var &amp; LAST.var question</title>
      <link>https://communities.sas.com/t5/SAS-Procedures/New-user-here-with-a-FIRST-var-LAST-var-question/m-p/207004#M51426</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Being a bit pedantic I would say records where the key is duplicated, not duplicate records. &lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Fri, 20 Mar 2015 22:43:08 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Procedures/New-user-here-with-a-FIRST-var-LAST-var-question/m-p/207004#M51426</guid>
      <dc:creator>ballardw</dc:creator>
      <dc:date>2015-03-20T22:43:08Z</dc:date>
    </item>
  </channel>
</rss>

