SAS:计算前几年的唯一值(保持计数)

时间:2017-01-01 19:24:24

标签: sas rows counting

我想知道在过去几年保持观察次数的最有效方法:

我的数据如下:

id store  year count 

1  green  2011  3        
2  green  2011  3        
3  green  2011  3        
4  green  2012  1        
5  blue   2012  1        
6  blue   2013  1        
7  red    2011  1        
8  red    2012  1        
9  red    2013  1   

基本上,我计算了ID的频率,并按商店和年份对它们进行分组,以跟踪当年在商店购买的观察数量。

现在,我想要做的是对前一年的观察数量。

期望的输出:

> id store  year count Count_Previous_Years
> 
> 1  green  2011  3        0
> 
> 2  green  2011  3        0
> 
> 3  green  2011  3        0
> 
> 4  green  2012  1        3
> 
> 5  blue   2012  1        0
> 
> 6  blue   2013  1        1
> 
> 7  red    2011  1        0
> 
> 8  red    2012  1        1
> 
> 9  red    2013  1        2

有没有办法在SQL中执行此操作?即Count(id)与前一年的“where”陈述?

1 个答案:

答案 0 :(得分:0)

这可以在数据步骤中完成,如下所示:

proc sort data=a;                                                                                                                       
by store year;run;                                                                                                                      

 data b;                                                                                                                            
 set a;                                                                                                                                  
  by store year;                                                                                                                          
  retain hold_year count2 previous; 

  if first.store then do;                                                                                                                 
     hold_year = year;                                                                                                                       
     previous = 0;                                                                                                                           
     count2 = 0;                                                                                                                             
  end;                                                                                                                                    
  if year > hold_year then do;                                                                                                            
     previous = count2; 
     hold_year = year;                                                                                                       
 end;                                                                                                                                    
 count2=count2+1;                                                                                                                        
 run;