如何获得具有不同开始结束日期的客户的任期?

时间:2018-11-02 19:16:37

标签: sql sas

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 :(得分:0)

由于要查看遵循线性类型顺序的数据并且顺序很重要,因此使用数据步骤是一种更好的方法。

首先对数据进行排序,然后使用DoW循环遍历并找出每个差距和连续的覆盖期。完成后,您可以计算差异并求和。如果您的数据很小,另一种选择是创建一个“每日”文件,该文件为每个日期创建一条记录,您可以删除重复项,然后根据需要重新汇总以获取连续的间隔和间隔。但是,它需要更多的代码和更长的时间。

将下面的变量名称替换为您的变量名称,可以正确使用句点了。

ID = client_id 产品编号= Policy_ID 有效日期=起始日期 ExpiryDate =结束日期

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;