1

次のデータセットがあります。

2 つの新しい列を追加する必要があります - 最初の列は、顧客ごとに行 2 から行 1 を減算します。これにより、顧客がメンバーシップを更新するまでの「日数」を得ることができます - 2 番目の列は、顧客がメンバーシップを更新した回数を計算しますこれは、0 から始まる単なるカウントになります。

Row   - Customer    - Renew Date   - Type of Renewal  - Days_Since  -Prev_Renewal
 1       - A        - June 10, 2010        - X                        
 2       - A        - May 01, 2011         - Y  
 3       - B        - Jan 05, 2010         - Y  
 4       - B        - Dec 10, 2010         - Z   
 5       - B        - Dec 10, 2011         - X    

これが私が現在使用しているコードです。これら 2 つのクエリ セットを 1 つに結合する方法はありますか?

data have;
informat renew_date ANYDTDTE.;
format renew_date DATE9.;
infile datalines dlm='-';
input Row Customer $ Renew_Date  Renewal_Type $;
datalines;
 1       - A        - June 10, 2010        - X                        
 2       - A        - May 01, 2011         - Y  
 3       - B        - Jan 05, 2010         - Y  
 4       - B        - Dec 10, 2010         - Z   
 5       - B        - Dec 10, 2011         - X    
 ;;;;
 run;

 data want;
 set have;
 by customer;
 retain prev_days;  *retain the value of prev_days from one row to the next;
 if first.customer 
 then 
    days_since=0; 
    *initialize days_since to zero for each customer's first record;
 else days_since=renew_date-prev_days; *otherwise set it to the difference;
 output;    *output the current record;
 prev_days=renew_date; 
 *now change prev_days to the renewal date so the next record has it;
 run; 

data want1;  
 set have;  
by customer;   
retain prev_renewal;   
if first.customer then prev_renewal=0;   
else prev_renewal=prev_renewal+1;   
output;   
run;

ありがとう

4

1 に答える 1

0

これは SQL ではなく、データ ステップ / Base SAS コード - 実際には SQL より前の SAS Institute 独自の (4GL) 言語です。

プログラムに関して - BY ステートメントを使用する前に、データを (この場合は顧客によって) ソートまたはインデックス付けする必要があることを指摘する価値があります。この場合、データラインは正しい順序でした。

必要な結合コードは次のとおりです。

data want (drop=prev_days);
   set have;
   by customer;
   retain prev_days; 
   if first.customer then do;
      days_since=0; 
      prev_renewal=0;
   end;
   else do;
      days_since=renew_date-prev_days;
      prev_renewal+1; /* IMPLIED retain - special syntax */
   end;
   output;
   prev_days=renew_date;
run; 
于 2014-02-22T13:27:24.753 に答える