Поскольку вы смотрите на данные, которые следуют линейному типу, порядок важен, поэтому использование шага данных - лучший подход.
Сначала отсортируйте ваши данные, а затем используйте цикл 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;