2013-08-01 39 views
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的更新?这是一个动态变量,会不时变化吗?我是否必须为每个用户名运行一个子选择符, betdate)和客户代码从表中获得?

谢谢。

+0

新增SQL标记,以便您可以从SQL专家 – Joe

回答

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矩阵中)。

+0

这工作正常获得更好的响应。对于上面player3的重复betdate的观察是我的一个错字,所以我改变了它。我试图用subselect而不是innerjoin来复制你的代码,如下所示,因为这样可以更容易地为customerCode提取第一个和最后一个值,但它不会评估为每个玩家单独的一行! 'proc sql; select H.username,(从V中选择V.customercode,其中V.username = H.username和V.betdate = \t(从X中选择max(X.betdate),其中X.username = H.username)) 从H组通过用户名; quit;' – user2146441

+0

正如我所指出的那样,如果您有联系,那么这不会解决为一个 - 您需要找出解决方法。 – Joe

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; 
+0

一个音符 - 重新合并基本上只有SAS,我不知道任何其他的SQL风格,这将允许你得到这个自动合并(或允许你选择不在组合或聚合函数中的东西)。 – Joe

+0

@Joe。 。 。你的声明的第一部分是真实的(这是'proc sql'和其他SQL方言之间的许多区别之一)。第二部分是不正确的。 MySQL支持不在'group by'子句中的列,就像某些版本的Postgres一样。这个功能甚至与更新版本的ANSI标准一致(尽管结果与'proc SQL'产生的结果大不相同)。 –

+0

那么,我只知道/使用SQL Server和Oracle,所以它技术上是真的;)谢谢澄清,但。 – Joe