SAS每个用户返回日期'编号/顺序'

时间:2013-06-05 19:20:50

标签: date numbers sas

我正在为许多用户运行以下查询,

proc SQL;
  select 
  username, 
  (select min(sub.date) from sample sub where sub.username = outer.username)  Format=worddatx20.  as firstDate,
  date Format=worddatx20. AS betdate,
  monotonic() as numberOfDaysActive
  from sample as outer;
quit; 

Monotonic()没有为numberOfDaysActive提供正确的值,因为它只是从返回的行的顶部开始计算,而不管用户是什么。对于每个用户,我需要知道数据库中用户第一天的时间,以及用户出现的每一天之后的天数。

示例数据如下:

 INPUT username $ amount date5 : ddmmyy8.;
 DATALINES; 
 player1 90 12/11/08
 player1 100 04/11/08
 player2 120 07/11/08
 player1 50 05/11/08
 player1 30 05/11/08
 player1 20 05/11/08
 player2 10 09/11/08
 player2 35 15/11/08
 PROC PRINT; RUN;

我想要的'numberOfDaysActive'字段如下:

 player1 90 12/11/08 3
 player1 100 04/11/08 1
 player2 120 07/11/08 1
 player1 50 05/11/08 2
 player1 30 05/11/08 2
 player1 20 05/11/08 2 
 player2 10 09/11/08 2 
 player2 35 15/11/08 3

提前致谢。

1 个答案:

答案 0 :(得分:2)

使用SAS的SQL无法做到这一点; SAS目前不支持窗口功能。这是一个解决方案,包括对数据集进行排序,并根据我的意愿计算 numberOfDaysActive 变量:

data have;
   input username $ amount date5 : ddmmyy8.;
   format date5 ddmmyy8.;
   row_id + 1;
   datalines; 
player1 90 12/11/08
player1 100 04/11/08
player2 120 07/11/08
player1 50 05/11/08
player1 30 05/11/08
player1 20 05/11/08
player2 10 09/11/08
player2 35 15/11/08
run;

proc sort data=have;
   by username date5;
run;

data want;
   set have;
      by username date5;
   retain numberOfDaysActive;
   if first.username then numberOfDaysActive = 0;
   if first.date5 then numberOfDaysActive + 1;
run;

proc sort data=want;
   by row_id;
run;

注意我添加了一个变量(row_id),用于保存数据的原始顺序。目前尚不清楚是否需要,但它只是为了以防万一。此外,我的结果与您指定的不完全匹配:最后两行的计算值为 2 3 player2 。如果他们确实应该指定 1 的值,我不知道是怎么做的。