BookmarkSubscribeRSS Feed
☑ This topic is solved. Need further help from the community? Please sign in and ask a new question.
Spintu
Quartz | Level 8

Hi,

I have a requirement from each subject visit date (VIS_DATE) to find out next highest visit date (Next_h_Vdate). 

I am having issues with getting max highest visit date as below highlighted.

 

WANT OUTPUT: 

1012-May-2330-May-23Next Visit date
10310-May-2311-May-23Next Vist date
proc sql;
   create table want as
   select a.*,b.Next_h_Vdate
    from data1 a
    left join data2 b
    on a.SUBJECT = b.SUBJECT and Next_h_Vdate >= Visitdate
	group by a.SUBJECT, a.VIS_DATE
	having Next_h_Vdate=max(Next_h_Vdate);
run;

 

 

 

SubjectVisitdateNext_h_VdateFlag
1012-May-232-May-23 
1012-May-2330-May-23Next Vist date
1025-May-231-May-23 
1025-May-235-May-23No More  Visit date
10310-May-2310-May-23 
10310-May-2311-May-23Next Vist date
10310-May-2312-May-23 
1 ACCEPTED SOLUTION

Accepted Solutions
Tom
Super User Tom
Super User

So first let's convert your listing into actual data.

data date1 ;
  input Subject $ Visitdate :date. Visit :$10.;
  format visitdate date9.;
cards;
101 2-May-23 Screen      
102 5-May-23 Week3      
103 10-May-23 Screen      
104 12-May-23 Week1      
;          
data date2 ;
  input Subject $ Next_h_Vdate :date. Folder :$10.;
  format Next_h_Vdate date9.;
cards;
101 2-May-23 Screen      
101 30-May-23 week1      
102 4-May-23 Week2      
102 5-May-23 Week3      
103 10-May-23 Screen      
103 11-May-23 week1      
103 13-May-23 Week2      
104 12-May-23 Week1      
104 15-May-23 Week2  
;

Now let's combine them matching on SUBJECT and only take combinations where the "next" date is larger than the current date.   While we are at it sort them.

proc sql;
create table want as
  select a.subject,a.visitdate,a.visit,b.next_h_vdate,b.folder
  from date1 a left join date2 b
  on a.subject=b.subject and b.next_h_vdate>a.visitdate
  order by a.subject,a.visitdate,b.next_h_Vdate
;
quit;

Now we have the information we need to check which record indicates the NEXT visit date.

data want;
  set want;
  by subject visitdate ;
  if first.visitdate then found=0;
  if (not found) and (next_h_vdate>visitdate) then do;
    found=1;
    flag = 'Next Highest Visit Date';
  end;
  else if found then delete;
  else if last.visitdate then flag='N/A';
  retain found;
run;

Result

                                           Next_h_
Obs    Subject    Visitdate    Visit         Vdate    Folder    found    flag

 1       101      02MAY2023    Screen    30MAY2023    week1       1      Next Highest Visit Date
 2       102      05MAY2023    Week3             .                0      N/A
 3       103      10MAY2023    Screen    11MAY2023    week1       1      Next Highest Visit Date
 4       104      12MAY2023    Week1     15MAY2023    Week2       1      Next Highest Visit Date

 

View solution in original post

6 REPLIES 6
Tom
Super User Tom
Super User

Where did those next visit date values come from?

You did not show the source data, just the results.

Spintu
Quartz | Level 8
next visit date values come from different source audit report. As i have merged finally get this data. here after I am not sure how to get it.
Tom
Super User Tom
Super User

@Spintu wrote:
next visit date values come from different source audit report. As i have merged finally get this data. here after I am not sure how to get it.

If you are asking for help on how to combine TWO datasets then show example inputs for both input datasets and the result you want for those example inputs.

Spintu
Quartz | Level 8

Hi,

I hope these tables Data1 and Data2 can help.

 

Data1     
SubjectVisitdateVisit   
1012-May-23Screen   
1025-May-23Week3   
10310-May-23Screen   
10412-May-23Week1   
      
Data2     
SubjectNext_h_VdateFolder   
1012-May-23Screen   
10130-May-23week1   
1024-May-23Week2   
1025-May-23Week3   
10310-May-23Screen   
10311-May-23week1   
10313-May-23Week2   
10412-May-23Week1   
10415-May-23Week2   
      
Want     
SubjectVisitdateVisitNext_h_VdateFolderFlag
1012-May-23Screen2-May-23Screen 
1012-May-23Screen30-May-23week1Next  Highest Vist date
1025-May-23Week34-May-23Week2N/A
1025-May-23Week35-May-23Week3N/A
10310-May-23Screen10-May-23Screen 
10310-May-23Screen11-May-23week1Next  Highest Vist date
10310-May-23Screen13-May-23Week2 
10412-May-23Week112-May-23Week1 
10412-May-23Week115-May-23Week2Next  Highest Vist date
Tom
Super User Tom
Super User

So first let's convert your listing into actual data.

data date1 ;
  input Subject $ Visitdate :date. Visit :$10.;
  format visitdate date9.;
cards;
101 2-May-23 Screen      
102 5-May-23 Week3      
103 10-May-23 Screen      
104 12-May-23 Week1      
;          
data date2 ;
  input Subject $ Next_h_Vdate :date. Folder :$10.;
  format Next_h_Vdate date9.;
cards;
101 2-May-23 Screen      
101 30-May-23 week1      
102 4-May-23 Week2      
102 5-May-23 Week3      
103 10-May-23 Screen      
103 11-May-23 week1      
103 13-May-23 Week2      
104 12-May-23 Week1      
104 15-May-23 Week2  
;

Now let's combine them matching on SUBJECT and only take combinations where the "next" date is larger than the current date.   While we are at it sort them.

proc sql;
create table want as
  select a.subject,a.visitdate,a.visit,b.next_h_vdate,b.folder
  from date1 a left join date2 b
  on a.subject=b.subject and b.next_h_vdate>a.visitdate
  order by a.subject,a.visitdate,b.next_h_Vdate
;
quit;

Now we have the information we need to check which record indicates the NEXT visit date.

data want;
  set want;
  by subject visitdate ;
  if first.visitdate then found=0;
  if (not found) and (next_h_vdate>visitdate) then do;
    found=1;
    flag = 'Next Highest Visit Date';
  end;
  else if found then delete;
  else if last.visitdate then flag='N/A';
  retain found;
run;

Result

                                           Next_h_
Obs    Subject    Visitdate    Visit         Vdate    Folder    found    flag

 1       101      02MAY2023    Screen    30MAY2023    week1       1      Next Highest Visit Date
 2       102      05MAY2023    Week3             .                0      N/A
 3       103      10MAY2023    Screen    11MAY2023    week1       1      Next Highest Visit Date
 4       104      12MAY2023    Week1     15MAY2023    Week2       1      Next Highest Visit Date

 

Spintu
Quartz | Level 8
Thank you for in explain in details.

sas-innovate-2024.png

Don't miss out on SAS Innovate - Register now for the FREE Livestream!

Can't make it to Vegas? No problem! Watch our general sessions LIVE or on-demand starting April 17th. Hear from SAS execs, best-selling author Adam Grant, Hot Ones host Sean Evans, top tech journalist Kara Swisher, AI expert Cassie Kozyrkov, and the mind-blowing dance crew iLuminate! Plus, get access to over 20 breakout sessions.

 

Register now!

How to Concatenate Values

Learn how use the CAT functions in SAS to join values from multiple variables into a single value.

Find more tutorials on the SAS Users YouTube channel.

Click image to register for webinarClick image to register for webinar

Classroom Training Available!

Select SAS Training centers are offering in-person courses. View upcoming courses for:

View all other training opportunities.

Discussion stats
  • 6 replies
  • 418 views
  • 1 like
  • 2 in conversation