Как получить срок пребывания клиента с разными датами начала? - PullRequest
0 голосов
/ 02 ноября 2018

enter image description here

Привет, ребята!

Просто интересно, как рассчитать время, которое клиент проводит. Как видите, были некоторые пробелы в том, что этот клиент не придерживался какой-либо политики. Я хотел бы убрать время разрыва из моего уравнения. Я использую

proc sql;
create table client_lost as 
select distinct party_id,
max(end_date) as max_end_date format date9.,
min(START_DATE) as min_start_date format date9.
group by 1
;quit;

data client_lost_2;
set client_lost;
tenure = yrdif(min_start_date,max_end_date,'Actual'); 
run;

Заранее спасибо!

1 Ответ

0 голосов
/ 02 ноября 2018

Поскольку вы смотрите на данные, которые следуют линейному типу, порядок важен, поэтому использование шага данных - лучший подход.

Сначала отсортируйте ваши данные, а затем используйте цикл DoW, чтобы пройти и идентифицировать каждый разрыв и непрерывный период покрытия. Как только это будет сделано, вы можете рассчитать разницу и суммировать их. Другой вариант, если ваши данные невелики, это создать «ежедневный» файл, который создает запись для каждой даты, вы удаляете дубликаты, а затем можете при необходимости повторно подводить итоги для непрерывных интервалов и пропусков. Но это больше кода и больше.

Замените имена переменных ниже вашими, и у вас все будет в порядке, чтобы исправить периоды.

ID = client_id ProductNumber = Policy_ID EffectiveDate = Start_Date ExpiryDate = End_Date

proc sort data=prod; 
by ID ProductNumber EffectiveDate descending ExpiryDate; 
run;

data align_periods;
do until(last.productNumber);
    set prod; by id productNumber;
    format effD expD yymmdd10.;
    if expD < effectiveDate then
        if not missing(expD) then do;
             output;
             call missing(effD, expD);
             end;
    effD = min(effD, effectiveDate);
    expD = max(expD, expiryDate);
    duration = expD - effD;
    end;
output;
drop effectiveDate expiryDate;
rename effD=effectiveDate expD=expiryDate;
run;

proc means data=align_periods noprint;
class ID;
var duration;
output out=want sum(duration) = tenure;
run;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...