我正在为许多用户运行以下查询,
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
提前致谢。
答案 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 的值,我不知道是怎么做的。