1

我有以下数据:

data have;
   input username $  betdate : datetime. customerCode;
   dateOnly = datepart(betdate) ;
   format betdate DATETIME.;
   format dateOnly ddmmyy8.;
   datalines; 
    player1 12NOV2008:12:04:01 1
    player1 04NOV2008:09:03:44 10
    player2 07NOV2008:07:03:33 1 
    player2 05NOV2008:09:00:00 0.5 
    player3 05NOV2008:09:05:00 1
    player2 07NOV2008:14:03:33 1 
    player1 05NOV2008:09:00:05 20
    player2 07NOV2008:16:03:33 1 
    player2 07NOV2008:18:03:33 1 
    player2 09NOV2008:10:05:10 0.7
    player3 15NOV2008:15:05:33 10 
    player3 15NOV2008:15:05:33 1
    player2 15NOV2008:15:05:33 0.1
run;
PROC PRINT; RUN;

如何运行“proc sql”命令来提取每个玩家的最新(即具有最新日期的不同(customerCode)(即:max(betdate)和每个玩家最早(再次按 betdate)更新 customerCode?这是一个不时变化的动态变量?我是否必须为每个用户名运行子选择,从表中查找 max(betdate) 和 customerCode?

谢谢。

4

2 回答 2

1

PROC SQL 不是最简单的方法,但它肯定是可能的。

proc sql;
 select H.username, H.customercode from have H inner join (
  select username, max(betdate) as maxdate from have group by username
 ) V
 on H.username=V.username and H.betdate=V.maxdate;
quit;

这将为 Player3 返回两个值,您必须弄清楚如何解决平局。但是,数据步骤要容易得多,最多需要一次排序和一次通过(并且在哈希中会更快,或者在 IML 矩阵中)。

于 2013-08-01T21:12:47.267 回答
1

您可以将proc sql称为聚合的功能与“重新合并”一起使用。以下查询按用户名输出具有最大日期的每一行:

proc sql;
 select H.username, H.customercode, date, max(date) as maxdate
 from have H 
 group by H.username
quit;

然后,您可以将其放在子查询中以获取所需的值:

proc sql;
 select username, customercode, date
 from (select H.username, H.customercode, date, max(date) as maxdate
       from have h
       group by H.username
      ) h
 where date = maxdate;
quit;

以下方法也可能有效,但我手头没有 SAS 来测试我现在的位置:

proc sql;
  select H.username, H.customercode, date
  from have H 
  group by H.username
  having date = max(date)
quit;
于 2013-08-01T21:44:45.780 回答