<?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: Identifying consecutive values in SAS Programming</title>
    <link>https://communities.sas.com/t5/SAS-Programming/Identifying-consecutive-values/m-p/980189#M378905</link>
    <description>&lt;DIV&gt;If it helps, yesterday I managed to implement the algorithm.&lt;/DIV&gt;&lt;P&gt;&lt;BR /&gt;proc sort data=input_ds out=input_ds_sort;&lt;BR /&gt;by SubjectId diff_days;&lt;BR /&gt;run;&lt;/P&gt;&lt;P&gt;data input_ds_pairs_sel;&lt;BR /&gt;set input_ds_sort;&lt;BR /&gt;by SubjectId;&lt;/P&gt;&lt;P&gt;&lt;BR /&gt;retain prev_day&amp;nbsp;&lt;BR /&gt;prev_flag1&amp;nbsp;&lt;BR /&gt;prev_is_prior&lt;BR /&gt;best_dt1 best_dt2 best_gap&amp;nbsp;&lt;BR /&gt;pa_dt1 pa_dt2;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;BR /&gt;if first.SubjectId then do;&lt;BR /&gt;prev_day = .;&lt;BR /&gt;prev_flag1 = 0;&lt;BR /&gt;prev_is_prior = .;&lt;BR /&gt;best_dt1 = .; best_dt2 = .; best_gap = .;&lt;BR /&gt;pa_dt1 = .; pa_dt2 = .;&lt;BR /&gt;end;&lt;/P&gt;&lt;P&gt;&lt;BR /&gt;is_prior = (-21 &amp;lt;= diff_days &amp;lt; 0);&lt;BR /&gt;is_after = (0 &amp;lt;= diff_days &amp;lt;= 7);&lt;/P&gt;&lt;P&gt;&lt;BR /&gt;curr_flag1 = (flag_KPI = 1);&lt;/P&gt;&lt;P&gt;&lt;BR /&gt;if not first.SubjectId then do;&lt;BR /&gt;if prev_flag1 = 1 and curr_flag1 = 1 then do;&lt;/P&gt;&lt;P&gt;/* PRIOR–PRIOR */&lt;BR /&gt;if prev_is_prior = 1 and is_prior = 1 then do;&lt;BR /&gt;gap = diff_days - prev_day;&lt;BR /&gt;&lt;BR /&gt;if missing(best_gap)&lt;BR /&gt;or (gap &amp;lt; best_gap)&lt;BR /&gt;or (gap = best_gap and diff_days &amp;gt; best_dt2) then do;&lt;BR /&gt;best_dt1 = prev_day;&lt;BR /&gt;best_dt2 = diff_days;&lt;BR /&gt;best_gap = gap;&lt;BR /&gt;end;&lt;BR /&gt;end;&lt;/P&gt;&lt;P&gt;/* PRIOR→AFTER */&lt;BR /&gt;else if prev_is_prior = 1 and is_after = 1 then do;&lt;BR /&gt;if missing(pa_dt1) then do;&lt;BR /&gt;pa_dt1 = prev_day;&lt;BR /&gt;pa_dt2 = diff_days;&lt;BR /&gt;end;&lt;BR /&gt;end;&lt;/P&gt;&lt;P&gt;end;&lt;BR /&gt;end;&lt;/P&gt;&lt;P&gt;&lt;BR /&gt;prev_day = diff_days;&lt;BR /&gt;prev_flag1 = curr_flag1;&lt;BR /&gt;prev_is_prior = (is_prior = 1);&lt;/P&gt;&lt;P&gt;&lt;BR /&gt;if last.SubjectId then do;&lt;BR /&gt;length source $12;&lt;BR /&gt;if not missing(best_dt1) then do;&lt;BR /&gt;source = 'prior-prior';&lt;BR /&gt;dt1 = best_dt1; dt2 = best_dt2; gap = best_gap;&lt;BR /&gt;output;&lt;BR /&gt;end;&lt;BR /&gt;else if not missing(pa_dt1) then do;&amp;nbsp;&lt;BR /&gt;source = 'prior-after';&lt;BR /&gt;dt1 = pa_dt1; dt2 = pa_dt2; gap = dt2 - dt1;&lt;BR /&gt;output;&lt;BR /&gt;end;&lt;BR /&gt;end;&lt;/P&gt;&lt;P&gt;keep SubjectId dt1 dt2 gap source ;&lt;BR /&gt;run;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Have a nice time&lt;/P&gt;&lt;P&gt;Regards&lt;/P&gt;</description>
    <pubDate>Fri, 05 Dec 2025 08:11:59 GMT</pubDate>
    <dc:creator>ChiSAS25</dc:creator>
    <dc:date>2025-12-05T08:11:59Z</dc:date>
    <item>
      <title>Identifying consecutive values</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Identifying-consecutive-values/m-p/980008#M378883</link>
      <description>&lt;P&gt;Can you help me program this algorithm that is giving me trouble?&lt;/P&gt;&lt;P&gt;I have a dataset (as the one I've attached) with patient ID and the difference in days between two dates, with a range of -21 to +7.&lt;/P&gt;&lt;P&gt;I need to identify patients who have two consecutive values of &lt;CODE&gt;flag_KPI = 1&lt;/CODE&gt; within the range [-21, 0).&lt;/P&gt;&lt;P&gt;If they have only one in the range [-21, 0), then I consider the case where they have two consecutive values of &lt;CODE&gt;flag_KPI = 1&lt;/CODE&gt;, one in the window [-21, 0) and the other in the window [0, 7].&lt;/P&gt;</description>
      <pubDate>Thu, 04 Dec 2025 09:43:16 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Identifying-consecutive-values/m-p/980008#M378883</guid>
      <dc:creator>ChiSAS25</dc:creator>
      <dc:date>2025-12-04T09:43:16Z</dc:date>
    </item>
    <item>
      <title>Re: Identifying consecutive values</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Identifying-consecutive-values/m-p/980027#M378885</link>
      <description>Please attach data using a data step and datalines.&lt;BR /&gt;Also, try to visualize your requirement as an output data set.&lt;BR /&gt;What have yo tried so far?</description>
      <pubDate>Thu, 04 Dec 2025 13:11:15 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Identifying-consecutive-values/m-p/980027#M378885</guid>
      <dc:creator>LinusH</dc:creator>
      <dc:date>2025-12-04T13:11:15Z</dc:date>
    </item>
    <item>
      <title>Re: Identifying consecutive values</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Identifying-consecutive-values/m-p/980028#M378886</link>
      <description>&lt;P&gt;&lt;SPAN&gt;&lt;!--  ScriptorStartFragment  --&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;DIV class=""&gt;&lt;SPAN&gt;Thnks for your reply&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV class=""&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV class=""&gt;&lt;SPAN&gt;Hereafter:&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV class=""&gt;&lt;SPAN&gt;data kpi_data;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV class=""&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; infile datalines dsd truncover;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV class=""&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; input SubjectId :8.&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV class=""&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; differences_in_days :8.&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV class=""&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; flag_KPI :8.;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV class=""&gt;&lt;SPAN&gt;datalines;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV class=""&gt;&lt;SPAN&gt;1,-21,1&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV class=""&gt;&lt;SPAN&gt;1,-14,1&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV class=""&gt;&lt;SPAN&gt;1,-7,1&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV class=""&gt;&lt;SPAN&gt;2,-16,1&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV class=""&gt;&lt;SPAN&gt;2,0,1&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV class=""&gt;&lt;SPAN&gt;2,6,1&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV class=""&gt;&lt;SPAN&gt;3,-16,&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV class=""&gt;&lt;SPAN&gt;3,-9,1&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV class=""&gt;&lt;SPAN&gt;3,5,&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV class=""&gt;&lt;SPAN&gt;4,1,&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV class=""&gt;&lt;SPAN&gt;5,-21,1&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV class=""&gt;&lt;SPAN&gt;5,0,1&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV class=""&gt;&lt;SPAN&gt;6,0,&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV class=""&gt;&lt;SPAN&gt;7,-11,&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV class=""&gt;&lt;SPAN&gt;7,1,&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV class=""&gt;&lt;SPAN&gt;7,6,&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV class=""&gt;&lt;SPAN&gt;8,-21,1&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV class=""&gt;&lt;SPAN&gt;8,-11,1&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV class=""&gt;&lt;SPAN&gt;8,0,1&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV class=""&gt;&lt;SPAN&gt;9,-14,&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV class=""&gt;&lt;SPAN&gt;9,-9,&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV class=""&gt;&lt;SPAN&gt;9,-6,&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV class=""&gt;&lt;SPAN&gt;9,1,&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV class=""&gt;&lt;SPAN&gt;9,2,&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV class=""&gt;&lt;SPAN&gt;10,-19,&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV class=""&gt;&lt;SPAN&gt;10,-14,&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV class=""&gt;&lt;SPAN&gt;10,-8,1&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV class=""&gt;&lt;SPAN&gt;10,-5,&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV class=""&gt;&lt;SPAN&gt;10,0,&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV class=""&gt;&lt;SPAN&gt;11,-10,&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV class=""&gt;&lt;SPAN&gt;11,-3,1&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV class=""&gt;&lt;SPAN&gt;11,0,1&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV class=""&gt;&lt;SPAN&gt;11,7,&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV class=""&gt;&lt;SPAN&gt;12,-21,1&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV class=""&gt;&lt;SPAN&gt;12,-4,1&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV class=""&gt;&lt;SPAN&gt;12,1,1&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV class=""&gt;&lt;SPAN&gt;12,2,1&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV class=""&gt;&lt;SPAN&gt;12,2,1&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV class=""&gt;&lt;SPAN&gt;12,7,&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV class=""&gt;&lt;SPAN&gt;13,-15,1&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV class=""&gt;&lt;SPAN&gt;13,2,&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV class=""&gt;&lt;SPAN&gt;14,-15,1&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV class=""&gt;&lt;SPAN&gt;14,-8,&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV class=""&gt;&lt;SPAN&gt;14,3,1&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV class=""&gt;&lt;SPAN&gt;15,-8,&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV class=""&gt;&lt;SPAN&gt;15,1,1&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV class=""&gt;&lt;SPAN&gt;16,-18,1&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV class=""&gt;&lt;SPAN&gt;16,-15,1&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV class=""&gt;&lt;SPAN&gt;16,-11,&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV class=""&gt;&lt;SPAN&gt;16,-8,1&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV class=""&gt;&lt;SPAN&gt;16,-4,&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV class=""&gt;&lt;SPAN&gt;16,-3,&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV class=""&gt;&lt;SPAN&gt;16,-2,&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV class=""&gt;&lt;SPAN&gt;16,-1,1&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV class=""&gt;&lt;SPAN&gt;16,5,1&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV class=""&gt;&lt;SPAN&gt;16,6,1&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV class=""&gt;&lt;SPAN&gt;17,-20,1&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV class=""&gt;&lt;SPAN&gt;17,-14,1&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV class=""&gt;&lt;SPAN&gt;17,-7,1&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV class=""&gt;&lt;SPAN&gt;17,0,1&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV class=""&gt;&lt;SPAN&gt;17,7,1&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV class=""&gt;&lt;SPAN&gt;18,-21,1&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV class=""&gt;&lt;SPAN&gt;18,-20,1&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV class=""&gt;&lt;SPAN&gt;18,-13,1&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV class=""&gt;&lt;SPAN&gt;18,-4,1&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV class=""&gt;&lt;SPAN&gt;18,0,1&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV class=""&gt;&lt;SPAN&gt;18,4,1&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV class=""&gt;&lt;SPAN&gt;18,7,1&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV class=""&gt;&lt;SPAN&gt;13,-17,1&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV class=""&gt;&lt;SPAN&gt;13,-1,1&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV class=""&gt;&lt;SPAN&gt;14,-15,1&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV class=""&gt;&lt;SPAN&gt;14,-8,1&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV class=""&gt;&lt;SPAN&gt;14,0,1&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV class=""&gt;&lt;SPAN&gt;14,7,1&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV class=""&gt;&lt;SPAN&gt;15,-21,1&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV class=""&gt;&lt;SPAN&gt;15,-13,1&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV class=""&gt;&lt;SPAN&gt;15,0,1&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV class=""&gt;&lt;SPAN&gt;16,-21,1&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV class=""&gt;&lt;SPAN&gt;16,-14,1&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV class=""&gt;&lt;SPAN&gt;16,-7,1&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV class=""&gt;&lt;SPAN&gt;16,0,1&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV class=""&gt;&lt;SPAN&gt;16,1,1&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV class=""&gt;&lt;SPAN&gt;17,-16,&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV class=""&gt;&lt;SPAN&gt;17,-9,&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV class=""&gt;&lt;SPAN&gt;17,-2,&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV class=""&gt;&lt;SPAN&gt;17,0,&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV class=""&gt;&lt;SPAN&gt;17,3,&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV class=""&gt;&lt;SPAN&gt;17,4,&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV class=""&gt;&lt;SPAN&gt;18,-17,1&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV class=""&gt;&lt;SPAN&gt;18,-5,1&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV class=""&gt;&lt;SPAN&gt;18,-2,&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV class=""&gt;&lt;SPAN&gt;18,2,&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV class=""&gt;&lt;SPAN&gt;18,5,&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV class=""&gt;&lt;SPAN&gt;19,-15,&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV class=""&gt;&lt;SPAN&gt;19,-1,1&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV class=""&gt;&lt;SPAN&gt;20,-6,&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV class=""&gt;&lt;SPAN&gt;20,-2,&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV class=""&gt;&lt;SPAN&gt;20,6,&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV class=""&gt;&lt;SPAN&gt;21,-21,&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV class=""&gt;&lt;SPAN&gt;21,-20,&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV class=""&gt;&lt;SPAN&gt;21,-18,1&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV class=""&gt;&lt;SPAN&gt;21,-7,1&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV class=""&gt;&lt;SPAN&gt;22,-20,1&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV class=""&gt;&lt;SPAN&gt;22,-15,1&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV class=""&gt;&lt;SPAN&gt;22,-6,1&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV class=""&gt;&lt;SPAN&gt;22,4,&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV class=""&gt;&lt;SPAN&gt;23,-18,&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV class=""&gt;&lt;SPAN&gt;23,-14,&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV class=""&gt;&lt;SPAN&gt;23,-11,&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV class=""&gt;&lt;SPAN&gt;23,1,1&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV class=""&gt;&lt;SPAN&gt;24,-14,1&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV class=""&gt;&lt;SPAN&gt;24,-10,1&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV class=""&gt;&lt;SPAN&gt;24,5,1&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV class=""&gt;&lt;SPAN&gt;25,-1,1&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV class=""&gt;&lt;SPAN&gt;25,-18,&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV class=""&gt;&lt;SPAN&gt;25,-3,&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV class=""&gt;&lt;SPAN&gt;26,-15,&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV class=""&gt;&lt;SPAN&gt;26,0,1&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV class=""&gt;&lt;SPAN&gt;27,-3,1&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV class=""&gt;&lt;SPAN&gt;27,-4,1&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV class=""&gt;&lt;SPAN&gt;28,-14,1&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV class=""&gt;&lt;SPAN&gt;28,3,1&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV class=""&gt;&lt;SPAN&gt;29,-10,1&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV class=""&gt;&lt;SPAN&gt;29,6,1&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV class=""&gt;&lt;SPAN&gt;30,-14,1&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV class=""&gt;&lt;SPAN&gt;30,-11,&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV class=""&gt;&lt;SPAN&gt;30,-8,&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV class=""&gt;&lt;SPAN&gt;30,-1,1&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV class=""&gt;&lt;SPAN&gt;30,3,1&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV class=""&gt;&lt;SPAN&gt;;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV class=""&gt;&lt;SPAN&gt;run;&lt;!--  ScriptorEndFragment  --&gt;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV class=""&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV class=""&gt;&lt;DIV&gt;I tried using &lt;CODE&gt;retain&lt;/CODE&gt; by creating two counters (one for days &amp;lt; 0 and one for days ≥ 0), but I wasn’t successful.&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;Thanks for any help&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>Thu, 04 Dec 2025 13:35:04 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Identifying-consecutive-values/m-p/980028#M378886</guid>
      <dc:creator>ChiSAS25</dc:creator>
      <dc:date>2025-12-04T13:35:04Z</dc:date>
    </item>
    <item>
      <title>Re: Identifying consecutive values</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Identifying-consecutive-values/m-p/980035#M378888</link>
      <description>&lt;P&gt;Ok, here's my shot at it:&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;data want;
	set work.kpi_data;
	retain prev_flag_kpi prev_diff;
	by SubjectId notsorted;
	if first.subjectId then do;
		prev_flag_kpi = .;
		prev_diff = .;
	end;
	else do;
		if prev_flag_kpi = 1 and flag_KPI then do;
			if  (-21 &amp;lt;= prev_diff &amp;lt;= 0 and 0 &amp;lt;= differences_in_days &amp;lt;=7) or
				(-21 &amp;lt;= differences_in_days &amp;lt;= 0 and 0 &amp;lt;= prev_diff &amp;lt;=7)
				then Flag_Consecutive = 1;
		end;
	end;
	if not last.SubjectId then do;
		prev_flag_kpi = flag_KPI;
		prev_diff = differences_in_days;
	end; 
run;&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;I'm noting the data is not sorted on SubjectId. As a data person I'm missing a clear unique key for each row, like a sequence no, or date.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Thu, 04 Dec 2025 16:00:28 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Identifying-consecutive-values/m-p/980035#M378888</guid>
      <dc:creator>LinusH</dc:creator>
      <dc:date>2025-12-04T16:00:28Z</dc:date>
    </item>
    <item>
      <title>Re: Identifying consecutive values</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Identifying-consecutive-values/m-p/980043#M378890</link>
      <description>&lt;BLOCKQUOTE&gt;&lt;HR /&gt;&lt;a href="https://communities.sas.com/t5/user/viewprofilepage/user-id/477620"&gt;@ChiSAS25&lt;/a&gt;&amp;nbsp;wrote:&lt;BR /&gt;
&lt;P&gt;Can you help me program this algorithm that is giving me trouble?&lt;/P&gt;
&lt;P&gt;I have a dataset (as the one I've attached) with patient ID and the difference in days between two dates, with a range of -21 to +7.&lt;/P&gt;
&lt;P&gt;I need to identify patients who have two consecutive values of &lt;CODE&gt;flag_KPI = 1&lt;/CODE&gt; within the range [-21, 0).&lt;/P&gt;
&lt;P&gt;If they have only one in the range [-21, 0), then I consider the case where they have two consecutive values of &lt;CODE&gt;flag_KPI = 1&lt;/CODE&gt;, one in the window [-21, 0) and the other in the window [0, 7].&lt;/P&gt;
&lt;HR /&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;Somethings that will help get a good result:&lt;/P&gt;
&lt;P&gt;What is the output data set supposed to look like after this process?&lt;/P&gt;
&lt;P&gt;What is the result if a patient only has one observation in the data?&lt;/P&gt;
&lt;P&gt;What is the result if no consecutive results meet either criteria?&lt;/P&gt;
&lt;P&gt;How does the result indicate which criteria was met?&lt;/P&gt;
&lt;P&gt;Do any of the patients involved have more than one sequence of values? If so, how might different starts and intervals modify the result?&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;A general note about about any data set involving date or time intervals. It is usually a very good idea to include variables that contain actual date, time or datetime values with the "base" value included. There are procedures that are intended to work with such for some of these interval types of questions.&lt;/P&gt;
&lt;P&gt;A data set as shown without actual dates might get sorted and if you have the same patient with 2 or more sequences then it might be quite awkward getting observations back into the correct order.&lt;/P&gt;</description>
      <pubDate>Thu, 04 Dec 2025 17:47:13 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Identifying-consecutive-values/m-p/980043#M378890</guid>
      <dc:creator>ballardw</dc:creator>
      <dc:date>2025-12-04T17:47:13Z</dc:date>
    </item>
    <item>
      <title>Re: Identifying consecutive values</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Identifying-consecutive-values/m-p/980189#M378905</link>
      <description>&lt;DIV&gt;If it helps, yesterday I managed to implement the algorithm.&lt;/DIV&gt;&lt;P&gt;&lt;BR /&gt;proc sort data=input_ds out=input_ds_sort;&lt;BR /&gt;by SubjectId diff_days;&lt;BR /&gt;run;&lt;/P&gt;&lt;P&gt;data input_ds_pairs_sel;&lt;BR /&gt;set input_ds_sort;&lt;BR /&gt;by SubjectId;&lt;/P&gt;&lt;P&gt;&lt;BR /&gt;retain prev_day&amp;nbsp;&lt;BR /&gt;prev_flag1&amp;nbsp;&lt;BR /&gt;prev_is_prior&lt;BR /&gt;best_dt1 best_dt2 best_gap&amp;nbsp;&lt;BR /&gt;pa_dt1 pa_dt2;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;BR /&gt;if first.SubjectId then do;&lt;BR /&gt;prev_day = .;&lt;BR /&gt;prev_flag1 = 0;&lt;BR /&gt;prev_is_prior = .;&lt;BR /&gt;best_dt1 = .; best_dt2 = .; best_gap = .;&lt;BR /&gt;pa_dt1 = .; pa_dt2 = .;&lt;BR /&gt;end;&lt;/P&gt;&lt;P&gt;&lt;BR /&gt;is_prior = (-21 &amp;lt;= diff_days &amp;lt; 0);&lt;BR /&gt;is_after = (0 &amp;lt;= diff_days &amp;lt;= 7);&lt;/P&gt;&lt;P&gt;&lt;BR /&gt;curr_flag1 = (flag_KPI = 1);&lt;/P&gt;&lt;P&gt;&lt;BR /&gt;if not first.SubjectId then do;&lt;BR /&gt;if prev_flag1 = 1 and curr_flag1 = 1 then do;&lt;/P&gt;&lt;P&gt;/* PRIOR–PRIOR */&lt;BR /&gt;if prev_is_prior = 1 and is_prior = 1 then do;&lt;BR /&gt;gap = diff_days - prev_day;&lt;BR /&gt;&lt;BR /&gt;if missing(best_gap)&lt;BR /&gt;or (gap &amp;lt; best_gap)&lt;BR /&gt;or (gap = best_gap and diff_days &amp;gt; best_dt2) then do;&lt;BR /&gt;best_dt1 = prev_day;&lt;BR /&gt;best_dt2 = diff_days;&lt;BR /&gt;best_gap = gap;&lt;BR /&gt;end;&lt;BR /&gt;end;&lt;/P&gt;&lt;P&gt;/* PRIOR→AFTER */&lt;BR /&gt;else if prev_is_prior = 1 and is_after = 1 then do;&lt;BR /&gt;if missing(pa_dt1) then do;&lt;BR /&gt;pa_dt1 = prev_day;&lt;BR /&gt;pa_dt2 = diff_days;&lt;BR /&gt;end;&lt;BR /&gt;end;&lt;/P&gt;&lt;P&gt;end;&lt;BR /&gt;end;&lt;/P&gt;&lt;P&gt;&lt;BR /&gt;prev_day = diff_days;&lt;BR /&gt;prev_flag1 = curr_flag1;&lt;BR /&gt;prev_is_prior = (is_prior = 1);&lt;/P&gt;&lt;P&gt;&lt;BR /&gt;if last.SubjectId then do;&lt;BR /&gt;length source $12;&lt;BR /&gt;if not missing(best_dt1) then do;&lt;BR /&gt;source = 'prior-prior';&lt;BR /&gt;dt1 = best_dt1; dt2 = best_dt2; gap = best_gap;&lt;BR /&gt;output;&lt;BR /&gt;end;&lt;BR /&gt;else if not missing(pa_dt1) then do;&amp;nbsp;&lt;BR /&gt;source = 'prior-after';&lt;BR /&gt;dt1 = pa_dt1; dt2 = pa_dt2; gap = dt2 - dt1;&lt;BR /&gt;output;&lt;BR /&gt;end;&lt;BR /&gt;end;&lt;/P&gt;&lt;P&gt;keep SubjectId dt1 dt2 gap source ;&lt;BR /&gt;run;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Have a nice time&lt;/P&gt;&lt;P&gt;Regards&lt;/P&gt;</description>
      <pubDate>Fri, 05 Dec 2025 08:11:59 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Identifying-consecutive-values/m-p/980189#M378905</guid>
      <dc:creator>ChiSAS25</dc:creator>
      <dc:date>2025-12-05T08:11:59Z</dc:date>
    </item>
    <item>
      <title>Re: Identifying consecutive values</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Identifying-consecutive-values/m-p/980213#M378911</link>
      <description>&lt;BLOCKQUOTE&gt;&lt;HR /&gt;&lt;a href="https://communities.sas.com/t5/user/viewprofilepage/user-id/477620"&gt;@ChiSAS25&lt;/a&gt;&amp;nbsp;wrote:&lt;BR /&gt;
&lt;DIV&gt;If it helps, yesterday I managed to implement the algorithm.&lt;/DIV&gt;
&lt;P&gt;&lt;BR /&gt;proc sort data=input_ds out=input_ds_sort;&lt;BR /&gt;by SubjectId diff_days;&lt;BR /&gt;run;&lt;/P&gt;
&lt;/BLOCKQUOTE&gt;
&lt;P&gt;Did you verify before this sort that the SubjectId did not involve more than one sequence of values?&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Note that if your data starts in appropriate grouped /ordered values within SubjectId then the Proc Sort is not needed. You should be able to use:&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;PRE&gt;data input_ds_pairs_sel;
set input;
by SubjectId  &lt;FONT color="#008000"&gt;&lt;STRONG&gt;NOTSORTED;&lt;/STRONG&gt;&lt;/FONT&gt;


retain prev_day 
prev_flag1 
prev_is_prior
best_dt1 best_dt2 best_gap 
pa_dt1 pa_dt2; &lt;/PRE&gt;
&lt;P&gt;The NOTSORTED option on the BY statement allows you to process values grouped together as a by variable but without sorting as the BY statement expects and may through an error when not sorted. This is a very useful option.&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Fri, 05 Dec 2025 17:32:39 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Identifying-consecutive-values/m-p/980213#M378911</guid>
      <dc:creator>ballardw</dc:creator>
      <dc:date>2025-12-05T17:32:39Z</dc:date>
    </item>
  </channel>
</rss>

