<?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: Count Consecutive Months with Proc SQL in SAS Programming</title>
    <link>https://communities.sas.com/t5/SAS-Programming/Count-Consecutive-Months-with-Proc-SQL/m-p/922802#M363353</link>
    <description>&lt;P&gt;For anyone reading along who is not required to use SQL, or anyone who is required to use a DATA step, or anyone who wants more efficient code than SQL, here is how I would do this in DATA step&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;data want;
    set have;
    ym=input(put(yearmo,6.),yymmn6.); /* Convert YYYYMM to an actual SAS date */
    prev_ym=lag(ym);                  /* YM of previous month */
    /* If YM of previous month is one month earlier, then increment value of CONSEC */
    if intck('month',prev_ym,ym)=1 then consec+1;
    /* Otherwise, not consecutive so set consec back to 1 */
    else consec=1;
    format ym yymmn6.;
    drop yearmo prev_ym;
run;&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&lt;/P&gt;</description>
    <pubDate>Wed, 03 Apr 2024 18:55:43 GMT</pubDate>
    <dc:creator>PaigeMiller</dc:creator>
    <dc:date>2024-04-03T18:55:43Z</dc:date>
    <item>
      <title>Count Consecutive Months with Proc SQL</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Count-Consecutive-Months-with-Proc-SQL/m-p/922599#M363291</link>
      <description>&lt;P&gt;I am not getting the output I want with my current SQL code within SAS. I need to use Proc SQL for this code -- not allowed to use data steps. I added “row number” and "WHAT I WANT" to the table for ease. Row 4 is not working properly. This is happening throughout the code when I don’t specify the ID as well. I am specifying this ID for the sake of understanding what is going on in the code. For row 4, it should be “2” for Consecutive, not 1 because the row above it is 1 month before. Why is this happening and how do I fix it?&lt;/P&gt;
&lt;P&gt;My end goal (which i have not coded for yet) is to look at which IDs have at least 12 consecutive months.&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;proc sql; 
create table test as 
SELECT year, ID, YearMo
    ,ROW_NUMBER() OVER (PARTITION BY ID, gap ORDER BY yearmo) AS Consecutive
FROM (
SELECT year, ID, YearMo
        ,CASE WHEN yearmo - LAG(yearmo, 1, yearmo - 1) OVER (PARTITION BY ID ORDER BY yearmo) IN (1, 89) 
            THEN 0 ELSE 1 
        END 
+ 
SUM(CASE WHEN yearmo - LAG(yearmo, 1, yearmo - 1) OVER (PARTITION BY ID ORDER BY yearmo) IN (1, 89) 
         THEN 0 ELSE 1 
    END) OVER (PARTITION BY ID ORDER BY yearmo) as gap
    FROM T1
) subquery
where ID = "7"
ORDER BY 
    ID, 
    yearmo;&lt;BR /&gt;quit;&lt;/CODE&gt;&lt;/PRE&gt;
&lt;TABLE border="1" width="100%"&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD width="10.934744268077601%"&gt;Row #&lt;/TD&gt;
&lt;TD width="12.522045855379188%"&gt;year&lt;/TD&gt;
&lt;TD width="10.141093474426807%"&gt;ID&lt;/TD&gt;
&lt;TD width="17.46031746031746%"&gt;YearMo&lt;/TD&gt;
&lt;TD width="25.485008818342152%"&gt;Consecutive&lt;/TD&gt;
&lt;TD width="23.456790123456788%"&gt;WHAT I WANT&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD width="10.934744268077601%"&gt;1&lt;/TD&gt;
&lt;TD width="12.522045855379188%"&gt;2019&lt;/TD&gt;
&lt;TD width="10.141093474426807%"&gt;7&lt;/TD&gt;
&lt;TD width="17.46031746031746%"&gt;201901&lt;/TD&gt;
&lt;TD width="25.485008818342152%"&gt;1&lt;/TD&gt;
&lt;TD width="23.456790123456788%"&gt;1&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD width="10.934744268077601%"&gt;2&lt;/TD&gt;
&lt;TD width="12.522045855379188%"&gt;2019&lt;/TD&gt;
&lt;TD width="10.141093474426807%"&gt;7&lt;/TD&gt;
&lt;TD width="17.46031746031746%"&gt;201902&lt;/TD&gt;
&lt;TD width="25.485008818342152%"&gt;2&lt;/TD&gt;
&lt;TD width="23.456790123456788%"&gt;2&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD width="10.934744268077601%"&gt;3&lt;/TD&gt;
&lt;TD width="12.522045855379188%"&gt;2019&lt;/TD&gt;
&lt;TD width="10.141093474426807%"&gt;7&lt;/TD&gt;
&lt;TD width="17.46031746031746%"&gt;201905&lt;/TD&gt;
&lt;TD width="25.485008818342152%"&gt;1&lt;/TD&gt;
&lt;TD width="23.456790123456788%"&gt;1&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD width="10.934744268077601%"&gt;4&lt;/TD&gt;
&lt;TD width="12.522045855379188%"&gt;2019&lt;/TD&gt;
&lt;TD width="10.141093474426807%"&gt;7&lt;/TD&gt;
&lt;TD width="17.46031746031746%"&gt;201906&lt;/TD&gt;
&lt;TD width="25.485008818342152%"&gt;1&lt;/TD&gt;
&lt;TD width="23.456790123456788%"&gt;2&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD width="10.934744268077601%"&gt;5&lt;/TD&gt;
&lt;TD width="12.522045855379188%"&gt;2019&lt;/TD&gt;
&lt;TD width="10.141093474426807%"&gt;7&lt;/TD&gt;
&lt;TD width="17.46031746031746%"&gt;201908&lt;/TD&gt;
&lt;TD width="25.485008818342152%"&gt;1&lt;/TD&gt;
&lt;TD width="23.456790123456788%"&gt;1&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD width="10.934744268077601%"&gt;6&lt;/TD&gt;
&lt;TD width="12.522045855379188%"&gt;2019&lt;/TD&gt;
&lt;TD width="10.141093474426807%"&gt;7&lt;/TD&gt;
&lt;TD width="17.46031746031746%"&gt;201910&lt;/TD&gt;
&lt;TD width="25.485008818342152%"&gt;1&lt;/TD&gt;
&lt;TD width="23.456790123456788%"&gt;1&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD width="10.934744268077601%"&gt;7&lt;/TD&gt;
&lt;TD width="12.522045855379188%"&gt;2019&lt;/TD&gt;
&lt;TD width="10.141093474426807%"&gt;7&lt;/TD&gt;
&lt;TD width="17.46031746031746%"&gt;201911&lt;/TD&gt;
&lt;TD width="25.485008818342152%"&gt;2&lt;/TD&gt;
&lt;TD width="23.456790123456788%"&gt;2&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD width="10.934744268077601%"&gt;8&lt;/TD&gt;
&lt;TD width="12.522045855379188%"&gt;2019&lt;/TD&gt;
&lt;TD width="10.141093474426807%"&gt;7&lt;/TD&gt;
&lt;TD width="17.46031746031746%"&gt;201912&lt;/TD&gt;
&lt;TD width="25.485008818342152%"&gt;3&lt;/TD&gt;
&lt;TD width="23.456790123456788%"&gt;3&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD width="10.934744268077601%"&gt;9&lt;/TD&gt;
&lt;TD width="12.522045855379188%"&gt;2020&lt;/TD&gt;
&lt;TD width="10.141093474426807%"&gt;7&lt;/TD&gt;
&lt;TD width="17.46031746031746%"&gt;202001&lt;/TD&gt;
&lt;TD width="25.485008818342152%"&gt;4&lt;/TD&gt;
&lt;TD width="23.456790123456788%"&gt;4&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD width="10.934744268077601%"&gt;10&lt;/TD&gt;
&lt;TD width="12.522045855379188%"&gt;2020&lt;/TD&gt;
&lt;TD width="10.141093474426807%"&gt;7&lt;/TD&gt;
&lt;TD width="17.46031746031746%"&gt;202002&lt;/TD&gt;
&lt;TD width="25.485008818342152%"&gt;5&lt;/TD&gt;
&lt;TD width="23.456790123456788%"&gt;5&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD width="10.934744268077601%"&gt;11&lt;/TD&gt;
&lt;TD width="12.522045855379188%"&gt;2020&lt;/TD&gt;
&lt;TD width="10.141093474426807%"&gt;7&lt;/TD&gt;
&lt;TD width="17.46031746031746%"&gt;202003&lt;/TD&gt;
&lt;TD width="25.485008818342152%"&gt;6&lt;/TD&gt;
&lt;TD width="23.456790123456788%"&gt;6&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD width="10.934744268077601%"&gt;12&lt;/TD&gt;
&lt;TD width="12.522045855379188%"&gt;2020&lt;/TD&gt;
&lt;TD width="10.141093474426807%"&gt;7&lt;/TD&gt;
&lt;TD width="17.46031746031746%"&gt;202006&lt;/TD&gt;
&lt;TD width="25.485008818342152%"&gt;1&lt;/TD&gt;
&lt;TD width="23.456790123456788%"&gt;1&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD width="10.934744268077601%"&gt;13&lt;/TD&gt;
&lt;TD width="12.522045855379188%"&gt;2020&lt;/TD&gt;
&lt;TD width="10.141093474426807%"&gt;7&lt;/TD&gt;
&lt;TD width="17.46031746031746%"&gt;202007&lt;/TD&gt;
&lt;TD width="25.485008818342152%"&gt;2&lt;/TD&gt;
&lt;TD width="23.456790123456788%"&gt;2&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD width="10.934744268077601%"&gt;14&lt;/TD&gt;
&lt;TD width="12.522045855379188%"&gt;2020&lt;/TD&gt;
&lt;TD width="10.141093474426807%"&gt;7&lt;/TD&gt;
&lt;TD width="17.46031746031746%"&gt;202008&lt;/TD&gt;
&lt;TD width="25.485008818342152%"&gt;3&lt;/TD&gt;
&lt;TD width="23.456790123456788%"&gt;3&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD width="10.934744268077601%"&gt;15&lt;/TD&gt;
&lt;TD width="12.522045855379188%"&gt;2020&lt;/TD&gt;
&lt;TD width="10.141093474426807%"&gt;7&lt;/TD&gt;
&lt;TD width="17.46031746031746%"&gt;202009&lt;/TD&gt;
&lt;TD width="25.485008818342152%"&gt;4&lt;/TD&gt;
&lt;TD width="23.456790123456788%"&gt;4&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD width="10.934744268077601%"&gt;16&lt;/TD&gt;
&lt;TD width="12.522045855379188%"&gt;2020&lt;/TD&gt;
&lt;TD width="10.141093474426807%"&gt;7&lt;/TD&gt;
&lt;TD width="17.46031746031746%"&gt;202010&lt;/TD&gt;
&lt;TD width="25.485008818342152%"&gt;5&lt;/TD&gt;
&lt;TD width="23.456790123456788%"&gt;5&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD width="10.934744268077601%"&gt;17&lt;/TD&gt;
&lt;TD width="12.522045855379188%"&gt;2020&lt;/TD&gt;
&lt;TD width="10.141093474426807%"&gt;7&lt;/TD&gt;
&lt;TD width="17.46031746031746%"&gt;202011&lt;/TD&gt;
&lt;TD width="25.485008818342152%"&gt;6&lt;/TD&gt;
&lt;TD width="23.456790123456788%"&gt;6&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD width="10.934744268077601%"&gt;18&lt;/TD&gt;
&lt;TD width="12.522045855379188%"&gt;2020&lt;/TD&gt;
&lt;TD width="10.141093474426807%"&gt;7&lt;/TD&gt;
&lt;TD width="17.46031746031746%"&gt;202012&lt;/TD&gt;
&lt;TD width="25.485008818342152%"&gt;7&lt;/TD&gt;
&lt;TD width="23.456790123456788%"&gt;7&lt;/TD&gt;
&lt;/TR&gt;
&lt;/TBODY&gt;
&lt;/TABLE&gt;</description>
      <pubDate>Tue, 02 Apr 2024 18:37:48 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Count-Consecutive-Months-with-Proc-SQL/m-p/922599#M363291</guid>
      <dc:creator>A_Halps</dc:creator>
      <dc:date>2024-04-02T18:37:48Z</dc:date>
    </item>
    <item>
      <title>Re: Count Consecutive Months with Proc SQL</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Count-Consecutive-Months-with-Proc-SQL/m-p/922600#M363292</link>
      <description>&lt;BLOCKQUOTE&gt;
&lt;P&gt;&lt;SPAN&gt;I need to use Proc SQL for this code -- not allowed to use data steps.&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;/BLOCKQUOTE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;Very sad, it would be much easier in a data step.&lt;/SPAN&gt;&lt;/P&gt;</description>
      <pubDate>Tue, 02 Apr 2024 18:47:03 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Count-Consecutive-Months-with-Proc-SQL/m-p/922600#M363292</guid>
      <dc:creator>PaigeMiller</dc:creator>
      <dc:date>2024-04-02T18:47:03Z</dc:date>
    </item>
    <item>
      <title>Re: Count Consecutive Months with Proc SQL</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Count-Consecutive-Months-with-Proc-SQL/m-p/922609#M363294</link>
      <description>&lt;P&gt;SAS Proc sql doesn't use Row_number, Partition, Lag , or Over so I have no idea what that code might do other than throw errors. I would be interested in seeing what the log looks like for that code.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;At least provide starting data in the form of a working data step and the rules involved. As it is we don't have a clue what the variable types are and since your question involves "consecutive months" that might be kind of crucial to workable solutions.&lt;/P&gt;</description>
      <pubDate>Tue, 02 Apr 2024 18:57:18 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Count-Consecutive-Months-with-Proc-SQL/m-p/922609#M363294</guid>
      <dc:creator>ballardw</dc:creator>
      <dc:date>2024-04-02T18:57:18Z</dc:date>
    </item>
    <item>
      <title>Re: Count Consecutive Months with Proc SQL</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Count-Consecutive-Months-with-Proc-SQL/m-p/922611#M363295</link>
      <description>&lt;P&gt;Are you able to pull directly from the database?&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;If so, you can use &lt;A href="https://go.documentation.sas.com/doc/en/lrcon/9.4/n1kbstf7vw0qcjn1ibfc8c78a9lc.htm" target="_self"&gt;pass-through&lt;/A&gt; and the code you have listed. I haven't evaluated your actual code - just offering an idea.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Otherwise, it cannot be done with SAS PROC SQL and requires a DATA step as mentioned by&amp;nbsp;&lt;a href="https://communities.sas.com/t5/user/viewprofilepage/user-id/10892"&gt;@PaigeMiller&lt;/a&gt;.&lt;/P&gt;</description>
      <pubDate>Tue, 02 Apr 2024 19:07:53 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Count-Consecutive-Months-with-Proc-SQL/m-p/922611#M363295</guid>
      <dc:creator>maguiremq</dc:creator>
      <dc:date>2024-04-02T19:07:53Z</dc:date>
    </item>
    <item>
      <title>Re: Count Consecutive Months with Proc SQL</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Count-Consecutive-Months-with-Proc-SQL/m-p/922618#M363296</link>
      <description>Google your SQL dialect (postgres SQL + gaps and Islands problem) to find a solution that works for your database. &lt;BR /&gt;&lt;BR /&gt;Examples: &lt;A href="https://medium.com/analytics-vidhya/sql-classic-problem-identifying-gaps-and-islands-across-overlapping-date-ranges-5681b5fcdb8#:~:text=Gaps%20and%20islands%20is%20a,sequence%20is%20missing%20(gaps" target="_blank"&gt;https://medium.com/analytics-vidhya/sql-classic-problem-identifying-gaps-and-islands-across-overlapping-date-ranges-5681b5fcdb8#:~:text=Gaps%20and%20islands%20is%20a,sequence%20is%20missing%20(gaps&lt;/A&gt;).&lt;BR /&gt;&lt;BR /&gt;&lt;A href="https://stackoverflow.com/questions/69978234/add-variable-to-count-consecutive-months" target="_blank"&gt;https://stackoverflow.com/questions/69978234/add-variable-to-count-consecutive-months&lt;/A&gt;</description>
      <pubDate>Tue, 02 Apr 2024 19:25:53 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Count-Consecutive-Months-with-Proc-SQL/m-p/922618#M363296</guid>
      <dc:creator>Reeza</dc:creator>
      <dc:date>2024-04-02T19:25:53Z</dc:date>
    </item>
    <item>
      <title>Re: Count Consecutive Months with Proc SQL</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Count-Consecutive-Months-with-Proc-SQL/m-p/922802#M363353</link>
      <description>&lt;P&gt;For anyone reading along who is not required to use SQL, or anyone who is required to use a DATA step, or anyone who wants more efficient code than SQL, here is how I would do this in DATA step&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;data want;
    set have;
    ym=input(put(yearmo,6.),yymmn6.); /* Convert YYYYMM to an actual SAS date */
    prev_ym=lag(ym);                  /* YM of previous month */
    /* If YM of previous month is one month earlier, then increment value of CONSEC */
    if intck('month',prev_ym,ym)=1 then consec+1;
    /* Otherwise, not consecutive so set consec back to 1 */
    else consec=1;
    format ym yymmn6.;
    drop yearmo prev_ym;
run;&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Wed, 03 Apr 2024 18:55:43 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Count-Consecutive-Months-with-Proc-SQL/m-p/922802#M363353</guid>
      <dc:creator>PaigeMiller</dc:creator>
      <dc:date>2024-04-03T18:55:43Z</dc:date>
    </item>
  </channel>
</rss>

