根据时间戳获取变量的最新更改

时间:2013-08-01 21:07:39

标签: sql sas

我有以下数据:

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?

感谢。

2 个答案:

答案 0 :(得分: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矩阵中)。

答案 1 :(得分: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;