我有以下数据:
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? p>
感谢。
答案 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;