<?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: How to Flag last hour records by group vars in SAS Programming</title>
    <link>https://communities.sas.com/t5/SAS-Programming/How-to-Flag-last-hour-records-by-group-vars/m-p/960101#M374505</link>
    <description>&lt;P&gt;Is that last YN variable what you want to get?&amp;nbsp; If not can you provide the output data for this input?&lt;/P&gt;
&lt;P&gt;If it is then explain in more detail the logic used to create it.&amp;nbsp;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Let's assume you meant that the data is grouped by the first four variables:&lt;/P&gt;
&lt;P&gt;SUBJID PARAMCD AVISIT ATPT&amp;nbsp;&lt;/P&gt;
&lt;P&gt;If so then why do you flag THREE of the observations as being the LAST for for the first group?&lt;/P&gt;
&lt;P&gt;Is it because they appear on the same date?&lt;/P&gt;</description>
    <pubDate>Mon, 24 Feb 2025 16:48:20 GMT</pubDate>
    <dc:creator>Tom</dc:creator>
    <dc:date>2025-02-24T16:48:20Z</dc:date>
    <item>
      <title>How to Flag last hour records by group vars</title>
      <link>https://communities.sas.com/t5/SAS-Programming/How-to-Flag-last-hour-records-by-group-vars/m-p/960096#M374504</link>
      <description>&lt;P&gt;Hi Team,&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;How to flag last hour records by group vars for below data.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;In below data sort by AVISIT ATPTN ADT ADTM then need to flag new var where last hour records by AVISIT and ATPTN&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;TABLE&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD&gt;SUBJID&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;PARAMCD&lt;/TD&gt;&lt;TD&gt;AVISIT&lt;/TD&gt;&lt;TD&gt;ATPT&lt;/TD&gt;&lt;TD&gt;ADTM&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;ADT&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;NEWFLAG&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;3002&lt;/TD&gt;&lt;TD&gt;ALT&lt;/TD&gt;&lt;TD&gt;Screening&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;01JAN2024:13:58:15&lt;/TD&gt;&lt;TD&gt;01-Jan-24&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;N&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;3002&lt;/TD&gt;&lt;TD&gt;ALT&lt;/TD&gt;&lt;TD&gt;Screening&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;01JAN2024:13:58:56&lt;/TD&gt;&lt;TD&gt;01-Jan-24&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;N&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;3002&lt;/TD&gt;&lt;TD&gt;ALT&lt;/TD&gt;&lt;TD&gt;Screening&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;01JAN2024:13:53:39&lt;/TD&gt;&lt;TD&gt;01-Jan-24&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;N&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;3002&lt;/TD&gt;&lt;TD&gt;ALT&lt;/TD&gt;&lt;TD&gt;Screening&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;01JAN2024:13:56:05&lt;/TD&gt;&lt;TD&gt;01-Jan-24&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;N&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;3002&lt;/TD&gt;&lt;TD&gt;ALT&lt;/TD&gt;&lt;TD&gt;Screening&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;01JAN2024:13:57:37&lt;/TD&gt;&lt;TD&gt;01-Jan-24&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;N&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;3002&lt;/TD&gt;&lt;TD&gt;ALT&lt;/TD&gt;&lt;TD&gt;Screening&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;01JAN2024:14:05:31&lt;/TD&gt;&lt;TD&gt;01-Jan-24&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;Y&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;3002&lt;/TD&gt;&lt;TD&gt;ALT&lt;/TD&gt;&lt;TD&gt;Screening&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;01JAN2024:14:06:13&lt;/TD&gt;&lt;TD&gt;01-Jan-24&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;Y&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;3002&lt;/TD&gt;&lt;TD&gt;ALT&lt;/TD&gt;&lt;TD&gt;Screening&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;01JAN2024:14:06:53&lt;/TD&gt;&lt;TD&gt;01-Jan-24&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;Y&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;3002&lt;/TD&gt;&lt;TD&gt;ALT&lt;/TD&gt;&lt;TD&gt;Cycle Day 1&lt;/TD&gt;&lt;TD&gt;PreDose&lt;/TD&gt;&lt;TD&gt;13JAN2024:10:20:10&lt;/TD&gt;&lt;TD&gt;13-Jan-24&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;Y&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;3002&lt;/TD&gt;&lt;TD&gt;ALT&lt;/TD&gt;&lt;TD&gt;Cycle Day 1&lt;/TD&gt;&lt;TD&gt;PreDose&lt;/TD&gt;&lt;TD&gt;13JAN2024:10:22:20&lt;/TD&gt;&lt;TD&gt;13-Jan-24&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;Y&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;3002&lt;/TD&gt;&lt;TD&gt;ALT&lt;/TD&gt;&lt;TD&gt;Cycle Day 1&lt;/TD&gt;&lt;TD&gt;PreDose&lt;/TD&gt;&lt;TD&gt;13JAN2024:10:23:30&lt;/TD&gt;&lt;TD&gt;13-Jan-24&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;Y&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;3002&lt;/TD&gt;&lt;TD&gt;ALT&lt;/TD&gt;&lt;TD&gt;Cycle Day 1&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;1Hour&lt;/TD&gt;&lt;TD&gt;13JAN2024:13:26:21&lt;/TD&gt;&lt;TD&gt;13-Jan-24&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;Y&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;3002&lt;/TD&gt;&lt;TD&gt;ALT&lt;/TD&gt;&lt;TD&gt;Cycle Day 1&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;1Hour&lt;/TD&gt;&lt;TD&gt;13JAN2024:13:27:18&lt;/TD&gt;&lt;TD&gt;13-Jan-24&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;Y&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;3002&lt;/TD&gt;&lt;TD&gt;ALT&lt;/TD&gt;&lt;TD&gt;Cycle Day 1&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;1Hour&lt;/TD&gt;&lt;TD&gt;13JAN2024:13:28:29&lt;/TD&gt;&lt;TD&gt;13-Jan-24&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;Y&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;3002&lt;/TD&gt;&lt;TD&gt;ALT&lt;/TD&gt;&lt;TD&gt;Cycle Day 1&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;1Hour&lt;/TD&gt;&lt;TD&gt;13JAN2024:13:45:05&lt;/TD&gt;&lt;TD&gt;13-Jan-24&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;Y&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;3002&lt;/TD&gt;&lt;TD&gt;ALT&lt;/TD&gt;&lt;TD&gt;Cycle Day 1&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;1Hour&lt;/TD&gt;&lt;TD&gt;13JAN2024:13:46:32&lt;/TD&gt;&lt;TD&gt;13-Jan-24&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;Y&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;3002&lt;/TD&gt;&lt;TD&gt;ALT&lt;/TD&gt;&lt;TD&gt;Cycle Day 1&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;1Hour&lt;/TD&gt;&lt;TD&gt;13JAN2024:13:47:45&lt;/TD&gt;&lt;TD&gt;13-Jan-24&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;Y&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Thank you,&lt;/P&gt;&lt;P&gt;Raja&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;&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Mon, 24 Feb 2025 16:37:48 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/How-to-Flag-last-hour-records-by-group-vars/m-p/960096#M374504</guid>
      <dc:creator>raja777pharma</dc:creator>
      <dc:date>2025-02-24T16:37:48Z</dc:date>
    </item>
    <item>
      <title>Re: How to Flag last hour records by group vars</title>
      <link>https://communities.sas.com/t5/SAS-Programming/How-to-Flag-last-hour-records-by-group-vars/m-p/960101#M374505</link>
      <description>&lt;P&gt;Is that last YN variable what you want to get?&amp;nbsp; If not can you provide the output data for this input?&lt;/P&gt;
&lt;P&gt;If it is then explain in more detail the logic used to create it.&amp;nbsp;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Let's assume you meant that the data is grouped by the first four variables:&lt;/P&gt;
&lt;P&gt;SUBJID PARAMCD AVISIT ATPT&amp;nbsp;&lt;/P&gt;
&lt;P&gt;If so then why do you flag THREE of the observations as being the LAST for for the first group?&lt;/P&gt;
&lt;P&gt;Is it because they appear on the same date?&lt;/P&gt;</description>
      <pubDate>Mon, 24 Feb 2025 16:48:20 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/How-to-Flag-last-hour-records-by-group-vars/m-p/960101#M374505</guid>
      <dc:creator>Tom</dc:creator>
      <dc:date>2025-02-24T16:48:20Z</dc:date>
    </item>
    <item>
      <title>Re: How to Flag last hour records by group vars</title>
      <link>https://communities.sas.com/t5/SAS-Programming/How-to-Flag-last-hour-records-by-group-vars/m-p/960111#M374506</link>
      <description>&lt;P&gt;First let's convert your sample listing into an actual dataset.&amp;nbsp; Let's make sure the ADTM variable is an actual DATETIME variable and eliminate that extra empty column.&amp;nbsp; let's rename your provide results as EXPECT so we can compare whether our code works.&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;data have;
  infile datalines dsd truncover ;
  input SUBJID $ PARAMCD $ AVISIT :$20. ATPT $ ADTM :datetime. ADT :date. extra $ EXPECT $;
  format ADTM datetime19. ADT date9.;
  drop extra ;
datalines;
3002,ALT,Screening, ,01JAN2024:13:58:15,01-Jan-24, ,N
3002,ALT,Screening, ,01JAN2024:13:58:56,01-Jan-24, ,N
3002,ALT,Screening, ,01JAN2024:13:53:39,01-Jan-24, ,N
3002,ALT,Screening, ,01JAN2024:13:56:05,01-Jan-24, ,N
3002,ALT,Screening, ,01JAN2024:13:57:37,01-Jan-24, ,N
3002,ALT,Screening, ,01JAN2024:14:05:31,01-Jan-24, ,Y
3002,ALT,Screening, ,01JAN2024:14:06:13,01-Jan-24, ,Y
3002,ALT,Screening, ,01JAN2024:14:06:53,01-Jan-24, ,Y
3002,ALT,Cycle Day 1,PreDose,13JAN2024:10:20:10,13-Jan-24, ,Y
3002,ALT,Cycle Day 1,PreDose,13JAN2024:10:22:20,13-Jan-24, ,Y
3002,ALT,Cycle Day 1,PreDose,13JAN2024:10:23:30,13-Jan-24, ,Y
3002,ALT,Cycle Day 1, 1Hour,13JAN2024:13:26:21,13-Jan-24, ,Y
3002,ALT,Cycle Day 1, 1Hour,13JAN2024:13:27:18,13-Jan-24, ,Y
3002,ALT,Cycle Day 1, 1Hour,13JAN2024:13:28:29,13-Jan-24, ,Y
3002,ALT,Cycle Day 1, 1Hour,13JAN2024:13:45:05,13-Jan-24, ,Y
3002,ALT,Cycle Day 1, 1Hour,13JAN2024:13:46:32,13-Jan-24, ,Y
3002,ALT,Cycle Day 1, 1Hour,13JAN2024:13:47:45,13-Jan-24, ,Y
;&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;Your data is not actually sorted by the grouping variables.&amp;nbsp; So you will probably need to sort it first.&amp;nbsp; Since it&amp;nbsp;is much easier to remember the last hour than to have to look into the future to find it we should sort by descending datetime.&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;proc sort data=have;
  by SUBJID PARAMCD AVISIT ATPT descending ADTM;
run;&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;Now you just need to remember what hour it was on the first observation for the group and then compare that to the current hour to make you new flag variable.&amp;nbsp;&amp;nbsp;&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;data want;
  set have;
  by SUBJID PARAMCD AVISIT ATPT descending ADTM;
  if first.atpt then firsthr = intnx('dthour',adtm,0);
  format firsthr datetime19.;
  retain firsthr ;
  flag = (intnx('dthour',adtm,0)=firsthr);
  drop firsthr;
run;&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;Result&lt;/P&gt;
&lt;P&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Tom_1-1740428259858.png" style="width: 999px;"&gt;&lt;img src="https://communities.sas.com/t5/image/serverpage/image-id/104910i62306EB28BAE3255/image-size/large?v=v2&amp;amp;px=999" role="button" title="Tom_1-1740428259858.png" alt="Tom_1-1740428259858.png" /&gt;&lt;/span&gt;&lt;/P&gt;
&lt;P&gt;If you really want that character variable instead of the easier boolean numeric variable then just use some IF/THEN logic instead of the simple assignment statement.&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;  if (intnx('dthour',adtm,0)=firsthr) then flag='Y' ;
  else flag='N';
&lt;/CODE&gt;&lt;/PRE&gt;</description>
      <pubDate>Mon, 24 Feb 2025 20:59:21 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/How-to-Flag-last-hour-records-by-group-vars/m-p/960111#M374506</guid>
      <dc:creator>Tom</dc:creator>
      <dc:date>2025-02-24T20:59:21Z</dc:date>
    </item>
    <item>
      <title>Re: How to Flag last hour records by group vars</title>
      <link>https://communities.sas.com/t5/SAS-Programming/How-to-Flag-last-hour-records-by-group-vars/m-p/960114#M374507</link>
      <description>&lt;P&gt;I think you want to construct a cutoff time exactly 1 hour (3600 seconds) prior to the last ADTM for each SUBJID AVISIT, yes?&amp;nbsp; Then keep all cases on or after the cutoff.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;This is untested in the absence of sample data in the form of a working DATA step:&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;data need  /view=need;
  set have (keep=subjid avisit atptn adtm);
  by subjid avsit atptn;
  if last.atptn; 
  adtm_cutoff=atptn-3600;
  drop adtm;
run;

data want (drop=adtm_cutoff);
  merge have need;
  by subjid avisit atptn;
  if adtm&amp;gt;=adtm_cutoff;
run;
&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;You see two DATA steps, but they will process the data as one step, since NEED is a data set VIEW, not a data set FILE.&lt;/P&gt;</description>
      <pubDate>Mon, 24 Feb 2025 20:32:54 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/How-to-Flag-last-hour-records-by-group-vars/m-p/960114#M374507</guid>
      <dc:creator>mkeintz</dc:creator>
      <dc:date>2025-02-24T20:32:54Z</dc:date>
    </item>
  </channel>
</rss>

