Bundling healthcare claims using SAS/SQL

Viewed 67

Observations from "other_claims" data set are to summed with the observations in the "event_claims" data set under the following conditions:

  1. "Other_claims" occur within a 90-day window of the event_claim, "stay_discharge_dt," are to be summed with the event cost("cost_event").
  2. If the "other_claim" partially overlaps with the 90-day period, only overlapping days are to be included.
  3. The included fraction: (# of overlapping days)/(total # of days of the other_claim)

Here's the sql solution I am considering. I'm curious if this could be more efficient?

data event_claims;
input patient_id stay_admission_dt mmddyy10. @14stay_discharge_dt mmddyy10. doctor cost_event;
format stay_admission_dt stay_discharge_dt mmddyy10.;    
datalines;
1 06/10/2019 06/15/2019 45 20000
2 10/18/2018 10/22/2018 78 30000
;

data other_claims;
length patient_id 3. type $19;
input patient_id Type$ service_start_date :mmddyy10. service_end_date :mmddyy10. service_cost dollar7.0;
format service_start_date service_end_date mmddyy10.;    
datalines;
1 skilled_nursing 06/15/2019 06/25/2019 $7,000 
1 home-health 06/25/2019 08/25/2019 $24,000
1 office_visit 07/1/2019 07/1/2019 $200 
1 home_health 08/26/2019 09/26/2019 $12,000 
2 er_visit 10/15/2018 10/16/2018 $1,500
2 home_health 10/23/2018 11/23/2018 $8,000
2 outpatient_services 01/18/2019 1/22/2019 $5,000 
; 




proc sql;
create table events_others as
select   a.person_id
        ,a.stay_admission_dt
        ,a.stay_discharge_dt
        ,a.stay_discharge_dt+90 as service_deadline format mmddyy10.
        ,b.service_start_date
        ,b.service_end_date
        ,case when b.service_start_date > calculated service_deadline 
            or b.service_start_date < a.stay_admission_dt
            then "service not payable"
            else "payable" end as payable
        ,case when calculated payable = "payable" 
              and b.service_end_date > calculated service_deadline
              then intck("days",b.service_end_date, calculated service_deadline )
              else 0 end as overlap   /* When the other claim event exceeds the 90-day window of the*/
        ,a.service_cost
        ,b.service_cost as service_cost_other
        ,case when calculated overlap ne 0 
              then (intck("days",b.service_start_date,b.service_end_date) + calculated overlap)/intck("days",b.service_start_date,b.service_end_date)
              else 0 end as partial_factor
        ,calculated partial_factor * b.service_cost as final_other_cost format=dollar9.2
from event_claims a
left join other_claims b
   on a.person_id=b.person_id
group by a.person_id
         ,a.stay_admission_dt
         ,a.stay_discharge_dt
order by a.person_id
,a.stay_admission_dt
;quit;
    
proc sql;
create table total_cost_of_care as
   select  a.*
           ,b.final_other_cost format=dollar9.2
           ,a.service_cost + final_other_cost as total_episode_cost format=dollar12.2
   from events_others a
   inner join
          (select  person_id
                   ,stay_admission_dt
                   ,sum(final_other_cost) as final_other_cost
           from events_others
           group by  person_id
                     ,stay_admission_dt
            ) b
   on (a.person_id=b.person_id
       and a.stay_admission_dt=b.stay_admission_dt)
    ;quit;
0 Answers
Related