Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Date 每个用户的SAS返回日期“编号/订单”_Date_Numbers_Sas - Fatal编程技术网

Date 每个用户的SAS返回日期“编号/订单”

Date 每个用户的SAS返回日期“编号/订单”,date,numbers,sas,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

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

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没有为numberOfDaysActivity提供正确的值,因为它只是从返回的行的顶部开始计数,而不管用户是谁。对于每个用户,我需要知道用户在数据库中的第一天是什么时候,以及用户出现的每一天的天数

样本数据如下:

 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

提前感谢。

使用SAS的SQL无法做到这一点;SAS目前不支持窗口功能。下面是一个解决方案,它涉及到对数据集进行排序,并根据我认为您需要的方式计算NumberOfDays活动变量:

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的计算值为2和3。如果他们真的应该有指定的值1,我不知道是怎么做到的。

你有每天的记录吗?还是有些用户跳过几天?您是否有可能添加一些示例数据和示例所需结果?请对OP进行编辑,而不是评论。在DDMMYY6前面加一个冒号。请再次编辑您的问题,根据您提供的示例数据,添加一个您希望看到的示例。如果你想做我认为你想做的事情,在数据步骤中比在SQL中更容易。这可以在纯SQL中完成,如下所示:选择用户名,选择mindate超过partition by username作为firstDate,选择date,行数超过partition by username按日期排序作为日期顺序从数据作为外部;但是SAS没有“分区”或“结束”功能。这很好,谢谢。我不需要原来的顺序,你对player2的最后两排是正确的!但是,如果日期包含时间戳怎么办?这会不会是“if first.date5然后numberOfDaysActive+1;”即使只是同一天的另一个观察结果,也将增加为新的一天?我如何添加另一个变量来指示该天是否对客户有利,即,将每天的金额值相加,并将其作为NumberOfDaysActivity旁边的指标变量?@user2146441请提出新问题,不要提及此问题一使用我在这里的回答作为如何提问SAS问题的模型:提供一个示例数据集,并显示您想要的结果。清晰的问题得到好的答案。