1

我正在为多个用户运行以下查询,并且

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

提前致谢。

4

1 回答 1

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) 用于保留数据的原始顺序。目前尚不清楚是否需要,但以防万一。此外,我的结果与您指定的不完全匹配:最后两行为 player2计算了23的值。如果它们确实应该具有指定的值1,我不知道这是如何完成的。

于 2013-06-06T04:20:24.983 回答