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

SAS: Counting Unique Values for Previous Years (keeping count)

我想知道记录往年观察结果的最有效方法:

我有这样的数据:

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 中有没有办法做到这一点?即用 "where" 语句计算前一年的 (id)?

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

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;