BookmarkSubscribeRSS Feed
yoyong555
Obsidian | Level 7

 

Hi everyone.

I have a table below.

Patient_no Rate_1 Rate_2 Rate_3 Rate_4 Rate_5
1          
2          
3          
4          

 

From the table, I would like to create tables showing the minimum and maximum values for each patient and for each rate.

 

The tables would look like these:

Patient_no min_rate max_rate
1    
2    
3    
4    

 

Rate_no min_rate max_rate
1    
2    
3    
4    
5    

 

Thank you. Greatly appreciated!

4 REPLIES 4
ChrisNZ
Tourmaline | Level 20

what's the difference between the 2 output tables?

Kurt_Bremser
Super User

First, transpose your dataset to a usable layout:

proc transpose
  data=wide
  out=trans (rename=(col1=rate))
;
by patient_no;
var rate:;
run;

data long;
set trans;
rate_no = input(scan(_name_,2,'_'),best.);
drop _name_;
run;

Then, your 2 queries become very simple:

proc sql;
create table want1 as
  select
    patient_no,
    min(rate) as min_rate,
    max(rate) as max_rate
  from long
  group by patient_no
;
create table want2 as
  select
    rate_no,
    min(rate) as min_rate,
    max(rate) as max_rate
  from long
  group by rate_no
;
quit;

Note: a long dataset layout is always better suited for analysis. See Maxim 19.

 

Edit: changed the summary functions from sum to min and max.

andreas_lds
Jade | Level 19

If you don't insist on using proc sql, two simple data-steps and a proc transpose create what you want.

 

data want1;
   set have;

   min_rate = min(of Rate:);
   max_rate = max(of Rate:);

   drop Rate:;
run;


proc transpose data=have out=transposed;
   var Rate:;
run;

data want2;
   set transposed(drop=_name_);
   
   Rate_No = _n_;
   min_rate = min(of Col:);
   max_rate = max(of Col:);

   drop Col:;
run;
andreas_lds
Jade | Level 19

Inspired by the dataset "long" - see the answer from @Kurt_Bremser - you could use proc summary twice, imho the proc performs much better than SQL on larger datasets.

 

proc summary data=long nway;
   class Patient_no;
   var Rate;
   output out=want1(drop= _:) min=min_rate max=max_rate;
run;

proc summary data=long nway;
   class Rate_no;
   var Rate;
   output out=want2(drop= _:) min=min_rate max=max_rate;
run;

sas-innovate-2026-white.png



April 27 – 30 | Gaylord Texan | Grapevine, Texas

Registration is open

Walk in ready to learn. Walk out ready to deliver. This is the data and AI conference you can't afford to miss.
Register now and lock in 2025 pricing—just $495!

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.

SAS Training: Just a Click Away

 Ready to level-up your skills? Choose your own adventure.

Browse our catalog!

Discussion stats
  • 4 replies
  • 3271 views
  • 3 likes
  • 4 in conversation