BookmarkSubscribeRSS Feed
🔒 This topic is solved and locked. Need further help from the community? Please sign in and ask a new question.
kz134
Obsidian | Level 7

Hi, 

 

I have a dataset:

 

 

ClientBusiness StageDate and Time
AAA120-Dec-18
AAA221-Dec-18
AAA324-Dec-18
AAA105-Jan-19
AAA306-Jan-19
BBB120-Dec-18
BBB221-Dec-18

 

I want to know how much time each client spent in each of the business stages.  I want:

ClientBusiness StageTime Spent (Days)
AAA12
AAA23
AAA312
BBB`11

 

The tricky thing is that each client can go back and fourth between stages. As you see here, Client AAA went to stage 1 twice. So client AAA spend 2 days in stage 1. 

 

Thanks for helping. 

1 ACCEPTED SOLUTION

Accepted Solutions
PaigeMiller
Diamond | Level 26

UNTESTED CODE (and assumes everything is sorted by client and date, and the dates are actual SAS date values)

 

data re_arrange;
    merge have have(firstobs=2 rename=(client=client2 date=date2) drop=stage);
    elapsed=date2-date1;
    if client2^=client then delete;
run;
proc summary data=re_arrange;
    class client stage;
    var elapsed;
    output out=want sum=sum_elapsed;
run;
--
Paige Miller

View solution in original post

3 REPLIES 3
PaigeMiller
Diamond | Level 26

UNTESTED CODE (and assumes everything is sorted by client and date, and the dates are actual SAS date values)

 

data re_arrange;
    merge have have(firstobs=2 rename=(client=client2 date=date2) drop=stage);
    elapsed=date2-date1;
    if client2^=client then delete;
run;
proc summary data=re_arrange;
    class client stage;
    var elapsed;
    output out=want sum=sum_elapsed;
run;
--
Paige Miller
kz134
Obsidian | Level 7
this worked. thank you
PeterClemmensen
Tourmaline | Level 20

A hash object approach

 

data have;
input Client $ Business_Stage Date:date9.;
format Date date9.;
datalines;
AAA 1 20-Dec-18
AAA 2 21-Dec-18
AAA 3 24-Dec-18
AAA 1 05-Jan-19
AAA 3 06-Jan-19
BBB 1 20-Dec-18
BBB 2 21-Dec-18
;

data _null_;
   if _N_ = 1 then do;
      declare hash h(ordered:'A');
      h.defineKey('Client', 'Business_Stage');
      h.defineData('Client', 'Business_Stage', 'time_spent');
      h.defineDone();
   end;

   merge have have(firstobs=2 rename=(client=client2 date=date2) drop=Business_Stage) end=lr;
   if client2 ne client then time_spent=0;
   else time_spent=intck('day', date, date2);

   if h.check() ne 0 then h.add();
   else do;
      _time_spent=time_spent;
      rc=h.find();
      time_spent=time_spent+_time_spent;
      h.replace();
   end;

   if lr then h.output(dataset:'want(where=(time_spent ne 0))');
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
  • 3 replies
  • 1250 views
  • 1 like
  • 3 in conversation