BookmarkSubscribeRSS Feed
uabcms
Calcite | Level 5


Need some help with summing day intervals.  I've got a file with an ID and an admit and discharge date.

Within each ID group I want to get the get the number of days from the discharge date (ddate) of  first vist to the admit date (adate) of the

current record.   But, if the interval reaches 91 days I need to start the count over again.  (stated another way, I want to

create 90-day groups within an ID.)

Ex:   

ID         adate1           ddate2         interval (what I want)         group  (what I want)

1          9/28/13          10/7/13              0                                             1   

2          9/20/13          9/29/13              0                                             1

3          1/4/13           1/22/13               0                                             1

3          2/24/13         2/28/13               33                                           1

4          2/4/13           2/5/13                 0                                             1

4          2/13/13         2/18/13               8                                             1

4          4/24/13         4/27/13               68                                           1              

4          6/3/13          6/10/13              108                                           2

5          8/18/13         8/22/13               0                                             1

5          12/1/13         12/12/13            101                                          2

5          12/14/13       12/22/13             114                                         2 

6          6/7/13          6/14/13                 0                                             1

6          6/14/13          6/26/13               0                                             1

6          7/3/13          7/19/13                 19                                           1

6          9/5/13          9/9/13                  83                                            1 

6          9/15/13     10/15/13                 93                                            2

Hope this is clear.     Thanks.

6 REPLIES 6
Haikuo
Onyx | Level 15

data have;

input ID         (adate1           ddate2) (:mmddyy8.) ;

format adate1 ddate2 mmddyy10.;

cards;

1          9/28/13          10/7/13      

2          9/20/13          9/29/13      

3          1/4/13           1/22/13      

3          2/24/13         2/28/13       

4          2/4/13           2/5/13       

4          2/13/13         2/18/13       

4          4/24/13         4/27/13       

4          6/3/13          6/10/13       

5          8/18/13         8/22/13       

5          12/1/13         12/12/13      

5          12/14/13       12/22/13       

6          6/7/13          6/14/13       

6          6/14/13          6/26/13      

6          7/3/13          7/19/13       

6          9/5/13          9/9/13        

6          9/15/13     10/15/13          

;

data want;

set have;

by id;

     retain _dd interval group;

       if first.id then do; _dd=ddate2; group=1;end;

       if first.id then interval=0; else interval=intck('day', _dd,adate1);

       if interval >= 91 then do; group+1; _dd=ddate2;end;

     drop _dd;

run;

Good Luck!

Haikuo

RW9
Diamond | Level 26 RW9
Diamond | Level 26

Something along the lines of:

proc sql;

  create table WORK.DATES2 as

  select  CURRENT.ID,

          CURRENT.ADATE,

          CURRENT.DDATE,

          datdif(BASE.ADATE,CURRENT.DDATE,"ACT/ACT") as INTERVAL,

          round(CALCULATED INTERVAL / 91,1) +1 as GRP

  from    WORK.DATES CURRENT

  left join (select ID,MIN(ADATE) as ADATE from WORK.DATES group by ID) BASE

  on      CURRENT.ID=BASE.ID;

quit;

Haikuo
Onyx | Level 15

"But, if the interval reaches 91 days I need to start the count over again"

the way I interpret this sentence is that the start point of counting needs to be reset once a new group is forming. If that is indeed the case (well, OP has the final call), I doubt Proc SQL could offer a solid approach.

Haikuo

RW9
Diamond | Level 26 RW9
Diamond | Level 26

Hi,

Maybe, but looking at the wanted data:

4          2/4/13           2/5/13                 0                                             1

4          2/13/13         2/18/13               8                                             1

4          4/24/13         4/27/13               68                                           1              

4          6/3/13          6/10/13              108                                           2

I took this as interval increase per row based on the difference.  Each 91 block of days is to be a new group starting at 1 and then increasing each 91 block by 1.  So I think our solutions are pretty much the same (the output is the same).

Haikuo
Onyx | Level 15

Only for this set of data. What if the gap between two rows are larger than 91 days? say 200 days?

uabcms
Calcite | Level 5

Thanks very much.   I appreciate your time.

The code works!

Just for clarification, I may have confused the post by mentioning the 90-day intervals.  As you assumed, the intervals don't have to start

at 91, 181, etc.   As long as the interval is at least 91 days out from the initial ddate of the previous block.  (This may still be

confusing.)

Thanks again.

SAS Innovate 2025: Call for Content

Are you ready for the spotlight? We're accepting content ideas for SAS Innovate 2025 to be held May 6-9 in Orlando, FL. The call is open until September 25. Read more here about why you should contribute and what is in it for you!

Submit your idea!

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
  • 1428 views
  • 0 likes
  • 3 in conversation