【问题标题】:SAS Return date 'number/order' per user每个用户的 SAS 返回日期“数量/订单”
【发布时间】:2013-06-05 19:20:49
【问题描述】:

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

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

提前致谢。

【问题讨论】:

  • 你每天都有记录吗?还是有些用户会跳过几天?您是否有机会添加一些示例数据和示例所需的结果?
  • 请对 OP 进行编辑而不是评论。在 DDMMYY6 之前放置一个冒号 (:)。让它以这种格式输入。
  • 请根据您提供的示例数据再次编辑您的问题,以添加您想要查看的内容的示例。如果你想做我认为你想做的事情,在数据步骤中比在 SQL 中更容易。
  • 这可以在纯 SQL 中像这样完成:选择用户名,选择 min(date) over (partition by username) as firstDate, date, row_number() over (partition by username order by date) as数据中的 date_sequence 作为外部;但 SAS 没有“分区”或“过度”功能。

标签: date numbers sas


【解决方案1】:

您不能通过使用 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),用于保留数据的原始顺序。目前尚不清楚是否需要,但以防万一。此外,我的结果与您指定的不完全匹配:最后两行计算出 player223 值。如果它们真的应该具有指定的 1 值,我不知道这是怎么做到的。

【讨论】:

  • 这很好,谢谢。我不需要原始顺序,您对 player2 的最后两行是正确的!但是,如果日期包含时间戳怎么办?这个'if first.date5 then numberOfDaysActive + 1;'增加新的一天,即使它只是同一天的另一个观察?
  • 如何添加另一个变量来指示客户当天是否有利可图,即将每天的金额值相加并将其作为 numberOfDaysActive 旁边的指标变量?
  • @user2146441 请提出一个新问题,不要不要参考这个问题。在这里使用我的答案作为如何提出 SAS 问题的模型:提供样本数据集 (HAVE) 并显示您想要的结果 (WANT)。明确的问题会得到很好的答案。
猜你喜欢
  • 2014-01-22
  • 2018-04-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-08
  • 1970-01-01
相关资源
最近更新 更多