<?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: increment within by group without lag or monotonic() in SAS Programming</title>
    <link>https://communities.sas.com/t5/SAS-Programming/increment-within-by-group-without-lag-or-monotonic/m-p/714098#M220405</link>
    <description>&lt;P&gt;I am not sure I see a clear rule for when the incrementing is supposed to stop/ restart.&lt;/P&gt;
&lt;P&gt;Is it supposed to be "if Endflag='Y' then reset counter?&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;It might help to provide examples where the different cases you are concerned with occur and demonstrate the result.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Here is an example data step that you can add values to so we have something we can test code with.&lt;/P&gt;
&lt;PRE&gt;data have;
   input datepid :$14. startdt :yymmdd10.8  pid $6.   initflag :$1. endflag :$1.  ;
   format startdt yymmddn8.;
datalines; 
2020102058123  20201020 58123  Y  .        
2020102158123  20201021 58123  .  .         
2020102258123  20201022 58123  .  Y       
2020110558123  20201105 58123  Y  Y       
2021010258123  20210102 58123  Y  .        
2021010858123  20210108 58123  .  Y       
;&lt;/PRE&gt;
&lt;P&gt;Your rule for the 25 days would likely involve at the first of some group setting the date value to a temporary retained variable that gets tested along with with your orther end rule using the INTCK function and the current date value.&lt;/P&gt;</description>
    <pubDate>Mon, 25 Jan 2021 22:05:08 GMT</pubDate>
    <dc:creator>ballardw</dc:creator>
    <dc:date>2021-01-25T22:05:08Z</dc:date>
    <item>
      <title>increment within by group without lag or monotonic()</title>
      <link>https://communities.sas.com/t5/SAS-Programming/increment-within-by-group-without-lag-or-monotonic/m-p/714090#M220403</link>
      <description>&lt;P&gt;This could be a common scenario for unix admins. For each user process, we have separate daily log files identified by date and PID. In common with many busy systems, the PID is reused every 1-2 months. I am trying to create a unique ID for&amp;nbsp; each file created by the user process and a sequence number.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;For future proofing, I want to avoid proc sql monotonic() and data step lag() . I think retain will still be supported in Viya.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;datepid (=(startdt * 1e5) + pid) is unique and initflag, endflag are usually reliable. We are trying to assign sessid and fileseq.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Below is what we want for pid = 58123 . This pattern could occur every 1-2 months for any PID.&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;BR /&gt;datepid&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; startdt&amp;nbsp; pid&amp;nbsp;&amp;nbsp;&amp;nbsp; initflag endflag sessid&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; logfileseq&lt;BR /&gt;&lt;BR /&gt;2020102058123&amp;nbsp; 20201020 58123&amp;nbsp; Y&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 2020102158123&amp;nbsp;&amp;nbsp;&amp;nbsp; 1&lt;BR /&gt;2020102158123&amp;nbsp; 20201021 58123&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 2020102158123&amp;nbsp;&amp;nbsp;&amp;nbsp; 2&lt;BR /&gt;2020102258123&amp;nbsp; 20201022 58123&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Y&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 2020102158123&amp;nbsp;&amp;nbsp;&amp;nbsp; 3&lt;BR /&gt;2020110558123&amp;nbsp; 20201105 58123&amp;nbsp; Y&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Y&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 2020110558123&amp;nbsp;&amp;nbsp;&amp;nbsp; 1&lt;BR /&gt;2021010258123&amp;nbsp; 20210102 58123&amp;nbsp; Y&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 2021010258123&amp;nbsp;&amp;nbsp;&amp;nbsp; 1&lt;BR /&gt;2021010858123&amp;nbsp; 20210108 58123&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Y&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 2021010258123&amp;nbsp;&amp;nbsp;&amp;nbsp; 2&lt;BR /&gt;&lt;BR /&gt;If PID was unique, this would work:&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;DIV&gt;
&lt;DIV&gt;proc sort data = logfiles ;&lt;/DIV&gt;
&lt;DIV&gt;by pid ;&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;DIV&gt;data logfileseq ;&lt;/DIV&gt;
&lt;DIV&gt;set logflles ;&lt;/DIV&gt;
&lt;DIV&gt;by pid ;&lt;/DIV&gt;
&lt;DIV&gt;retain sessid ;&lt;/DIV&gt;
&lt;DIV&gt;if first.pid then do ;&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp; logfileseq =1 ;&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp; sessid = datepid ;&lt;/DIV&gt;
&lt;DIV&gt;end ;&lt;/DIV&gt;
&lt;DIV&gt;else logfileseq +1 ;&lt;/DIV&gt;
&lt;DIV&gt;run ;&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;DIV&gt;
&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;DIV&gt;In case InitFlag and EndFlag are missing, I would like to include that max(startdt) - min(startdt) &amp;lt; 25 by pid is usually the same sessid.&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;DIV&gt;Ideally, we would use ANSI SQL but logfileseq is a challenge.&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Mon, 25 Jan 2021 21:43:04 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/increment-within-by-group-without-lag-or-monotonic/m-p/714090#M220403</guid>
      <dc:creator>acfarrer</dc:creator>
      <dc:date>2021-01-25T21:43:04Z</dc:date>
    </item>
    <item>
      <title>Re: increment within by group without lag or monotonic()</title>
      <link>https://communities.sas.com/t5/SAS-Programming/increment-within-by-group-without-lag-or-monotonic/m-p/714098#M220405</link>
      <description>&lt;P&gt;I am not sure I see a clear rule for when the incrementing is supposed to stop/ restart.&lt;/P&gt;
&lt;P&gt;Is it supposed to be "if Endflag='Y' then reset counter?&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;It might help to provide examples where the different cases you are concerned with occur and demonstrate the result.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Here is an example data step that you can add values to so we have something we can test code with.&lt;/P&gt;
&lt;PRE&gt;data have;
   input datepid :$14. startdt :yymmdd10.8  pid $6.   initflag :$1. endflag :$1.  ;
   format startdt yymmddn8.;
datalines; 
2020102058123  20201020 58123  Y  .        
2020102158123  20201021 58123  .  .         
2020102258123  20201022 58123  .  Y       
2020110558123  20201105 58123  Y  Y       
2021010258123  20210102 58123  Y  .        
2021010858123  20210108 58123  .  Y       
;&lt;/PRE&gt;
&lt;P&gt;Your rule for the 25 days would likely involve at the first of some group setting the date value to a temporary retained variable that gets tested along with with your orther end rule using the INTCK function and the current date value.&lt;/P&gt;</description>
      <pubDate>Mon, 25 Jan 2021 22:05:08 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/increment-within-by-group-without-lag-or-monotonic/m-p/714098#M220405</guid>
      <dc:creator>ballardw</dc:creator>
      <dc:date>2021-01-25T22:05:08Z</dc:date>
    </item>
    <item>
      <title>Re: increment within by group without lag or monotonic()</title>
      <link>https://communities.sas.com/t5/SAS-Programming/increment-within-by-group-without-lag-or-monotonic/m-p/714104#M220409</link>
      <description>Yes, reset counter when EndFlag = 'Y'. Sorry for not specifying. &lt;BR /&gt;'group by pid having max(startdt) - min(startdt) &amp;lt; 25' works in SQL but I am not sure of the equivalent data step logic. I am trying to avoid retained values if possible.&lt;BR /&gt;</description>
      <pubDate>Mon, 25 Jan 2021 22:29:38 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/increment-within-by-group-without-lag-or-monotonic/m-p/714104#M220409</guid>
      <dc:creator>acfarrer</dc:creator>
      <dc:date>2021-01-25T22:29:38Z</dc:date>
    </item>
    <item>
      <title>Re: increment within by group without lag or monotonic()</title>
      <link>https://communities.sas.com/t5/SAS-Programming/increment-within-by-group-without-lag-or-monotonic/m-p/714121#M220413</link>
      <description>&lt;P&gt;Without supplying the real data, I am not sure how much is needed but I have added PIDs 36494 and 63423 to this sample. The natural order is usually by datepid: &lt;BR /&gt;&lt;BR /&gt;datepid&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; startdt&amp;nbsp; pid&amp;nbsp;&amp;nbsp;&amp;nbsp; initflag endflag sessid&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; logfileseq&lt;BR /&gt;&lt;BR /&gt;2020102036494&amp;nbsp; 20201020 36494&amp;nbsp; Y&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Y&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 2020102036494&amp;nbsp;&amp;nbsp;&amp;nbsp; 1&lt;BR /&gt;2020102058123&amp;nbsp; 20201020 58123&amp;nbsp; Y&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 2020102158123&amp;nbsp;&amp;nbsp;&amp;nbsp; 1&lt;BR /&gt;2020102063423&amp;nbsp; 20201020 63423&amp;nbsp; Y&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 2020102063423&amp;nbsp;&amp;nbsp;&amp;nbsp; 1&lt;BR /&gt;2020102158123&amp;nbsp; 20201021 58123&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 2020102158123&amp;nbsp;&amp;nbsp;&amp;nbsp; 2&lt;BR /&gt;2020102163423&amp;nbsp; 20201021 63423&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Y&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 2020102063423&amp;nbsp;&amp;nbsp;&amp;nbsp; 2&lt;BR /&gt;2020102258123&amp;nbsp; 20201022 58123&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Y&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 2020102158123&amp;nbsp;&amp;nbsp;&amp;nbsp; 3&lt;BR /&gt;2020110558123&amp;nbsp; 20201105 58123&amp;nbsp; Y&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Y&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 2020110558123&amp;nbsp;&amp;nbsp;&amp;nbsp; 1&lt;BR /&gt;2021010258123&amp;nbsp; 20210102 58123&amp;nbsp; Y&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 2021010258123&amp;nbsp;&amp;nbsp;&amp;nbsp; 1&lt;BR /&gt;2021010858123&amp;nbsp; 20210108 58123&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Y&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 2021010258123&amp;nbsp;&amp;nbsp;&amp;nbsp; 2&lt;BR /&gt;2021010863423&amp;nbsp; 20210108 63423&amp;nbsp; Y&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Y&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 2021010863423&amp;nbsp;&amp;nbsp;&amp;nbsp; 1&lt;BR /&gt;&lt;BR /&gt;My latest version has proc sort ; by pid startdt ; to assign logfileseq correctly.&lt;/P&gt;</description>
      <pubDate>Mon, 25 Jan 2021 23:02:46 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/increment-within-by-group-without-lag-or-monotonic/m-p/714121#M220413</guid>
      <dc:creator>acfarrer</dc:creator>
      <dc:date>2021-01-25T23:02:46Z</dc:date>
    </item>
    <item>
      <title>Re: increment within by group without lag or monotonic()</title>
      <link>https://communities.sas.com/t5/SAS-Programming/increment-within-by-group-without-lag-or-monotonic/m-p/714150#M220426</link>
      <description>&lt;P&gt;All my testing used first.pid which I was reluctant to abandon. After some further data validation, InitFlag looks reliable and the logic is simpler:&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;DIV&gt;
&lt;DIV&gt;proc sort data = logfiles ;&lt;/DIV&gt;
&lt;DIV&gt;by pid startdt ;&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;DIV&gt;data logfileseq ;&lt;/DIV&gt;
&lt;DIV&gt;set logflles ;&lt;/DIV&gt;
&lt;DIV&gt;retain sessid ;&lt;/DIV&gt;
&lt;DIV&gt;if InitFlag = 'Y' then do ;&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp; logfileseq =1 ;&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp; sessid = datepid ;&lt;/DIV&gt;
&lt;DIV&gt;end ;&lt;/DIV&gt;
&lt;DIV&gt;else logfileseq +1 ;&lt;/DIV&gt;
&lt;DIV&gt;run ;&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;DIV&gt;&lt;SPAN class="im"&gt;&lt;SPAN class="im"&gt;For further validation, I will create a table of datediff = max(startdt) - min(startdt) by sessid, datepid and pid.&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;DIV&gt;&lt;SPAN class="im"&gt;&lt;SPAN class="im"&gt;&lt;SPAN class="im"&gt;&lt;SPAN class="im"&gt;This can be marked as solved for now.&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/DIV&gt;
&lt;/DIV&gt;</description>
      <pubDate>Tue, 26 Jan 2021 03:03:06 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/increment-within-by-group-without-lag-or-monotonic/m-p/714150#M220426</guid>
      <dc:creator>acfarrer</dc:creator>
      <dc:date>2021-01-26T03:03:06Z</dc:date>
    </item>
  </channel>
</rss>

