SAS聚合行计算

时间:2016-09-10 00:33:02

标签: sas

我是SAS的初学者用户,特别是在汇总行计算方面。

以下是我相信你们之前可能遇到过的一个问题。

我所拥有的数据与保险单相关,这里是一个示例数据集:从左到右的列是客户编号,策略编号,策略状态,策略开始日期和策略取消日期(如果策略未激活,否则是一个缺失值)。

data have;
    informat cust_id 8. pol_num $10. status $10. start_date can_date DDMMYY10.;
    input cust_id pol_num status start_date can_date;
    format start_date can_date date9.;
    datalines;
    110 P110001 Cancelled 04/12/2004 10/10/2013
    110 P110002 Active 01/03/2005 .
    123 P123001 Cancelled 21/07/1998 23/04/2013
    123 P123003 Cancelled 22/10/1987 01/11/2011
    133 P133001 Active 19/02/2001 .
    133 P133001 Active 20/02/2002 .
    ;
run;

基本上我想将这些策略级别信息推送到客户级别,如果客户持有至少一个活动策略,那么他的状态将是“活动”,否则如果他的所有策略都被取消,那么他的状态变为“无效”状态。我还需要一个客户"开始约会"它取决于该客户下最早的政策开始日期。如果客户是“非活动”,那么我需要客户的最新政策取消日期作为客户的退出日期。

以下是我需要的内容:

data want;
    informat cust_id 8. status $10. start_date exit_date DDMMYY10.;
    input cust_id status start_date exit_date;
    format start_date exit_date date9.;
    datalines;
    110 Active 01/03/2005 .
    123 Inactive 22/10/1987 23/04/2013
    133 Active 19/02/2001 .
    ;
run;

任何形式的解决方案将非常感谢! DATA步骤或PROC SQL都可以。

非常感谢你。

2 个答案:

答案 0 :(得分:1)

你可以这样做:

<td>

答案 1 :(得分:0)

您可以在DATA步骤中攻击该问题。这是一种简单的方法,假设您的数据按 cust_id start_date 排序......

data want;
set have (keep=cust_id status start_date exit_date);

where upcase(status) contains 'ACTIVE';
by cust_id start_date;

  if first.start_date then output;
else delete;

run;

/*BEGINNER NOTES*/

*1] WHERE tells SAS to compile only records that fit a certain 
    condition - the DS 'want' will never have any observations with
    'CANCELLED' in the status variable;

*2] I use UPCASE() to standardize the contents of status, as CONTAINS
    is a case-sensitive operator; 

*3] FIRST.variable = 1 if the value is the first encountered in 
    the compile phase;