我有两列:
GRP_ACCT_NO,TRANS_DATE
数据是关于不同帐户进行的交易。因此,GRP_ACCT_NO具有重复值,TRANS_DATE给出日期,该特定帐户进行了交易。我在数据集中有大约150万条记录,但只有97k个唯一帐户。我想找到SAS中每个帐户的第二个最新交易日期
以下是我尝试的代码:
proc sql;
create table second_latest_trans as
select GRP_ACCT_NO,Max(TRANS_DATE) from project.spend as ps
where TRANS_DATE < (select max(TRANS_DATE)
from project.spend as ps2
where ps.GRP_ACCT_NO = ps2.GRP_ACCT_NO
group by GRP_ACCT_NO)
group by GRP_ACCT_NO;
quit;
代码似乎没有得到任何结果。它需要很长时间才能加载。
请帮助!!
答案 0 :(得分:2)
SQL没有观察顺序的概念。使用DATA步骤。如果您的数据尚未排序,则对其进行排序(创建索引)。
如果您只想要第二条记录,即使有联系,您也可以只计算每个帐户的记录。
int age;
int employeeID; // Auto-generated
float salary;
string lastName;
string firstName;
string ssn;
如果有相同TRANS_DATE值的多条记录,并且您想要第二个不同的TRANS_DATE值,那么这个更复杂的步骤就可以了。
data second_latest_trans;
set project.spend;
by GRP_ACCT_NO TRANS_DATE;
if first.grp_acct then recno=0;
recno+1;
if recno=2 then output;
run;
答案 1 :(得分:1)
您的查询(除格式外)看起来合理。我想知道子查询中的group by
是否会抛弃它。试试这个版本:
proc sql;
create table second_latest_trans as
Select GRP_ACCT_NO, Max(TRANS_DATE)
from project.spend ps
where TRANS_DATE < (SELECT max(ps2.TRANS_DATE)
from project.spend ps2
where ps.GRP_ACCT_NO = ps2.GRP_ACCT_NO
)
group by GRP_ACCT_NO;
quit;
如果您希望此速度更快,则需要project.spend(GRP_ACCT_NO, TRANS_DATE)
上的索引。数据步骤解决方案(在另一个答案中提出)可能要快得多。
答案 2 :(得分:0)
SAS SQL不是处理序列问题的好工具。如果你想在小组中找到第二个最高或最低记录,也许你可以试试这个。我以班为例在每组中找到第二重量人。方法是首先从组中减去最重量的人,然后选择最重量的人,然而,它可以处理领带重量。希望能给你一些想法。
proc sql;
select * from (select * from sashelp.class where weight not in
(select weight from sashelp.class group by age having weight=max(weight)))
group by age having weight=max(weight);
quit;
答案 3 :(得分:0)
for (Tile t:tile) p.add(t);
按acct_no排序,因此最大的日期位于顶部。
data test;
set spend;
run;
删除与最新日期对应的记录
proc sort data=test;
by grp_acct_no trans_date descending;
run;
现在,与每个acct_no对应的第一个记录是第二大日期,因为删除了最大的一个日期。删除除此记录以外的所有内容。
data test2;
set test;
by grp_acct_no trans_date;
if first.grp_acct_no =1 and first.trans_date =1 then delete;
run;
test3是最终数据集
答案 4 :(得分:0)
您可以使用retain
:
data want ; set have ; by GRP_ACCT_NO TRANS_DATE ; retain T1 T2 . ; if first.GRP_ACCT_NO then call missing(T1,T2) ; if TRANS_DATE > T1 then do ; T2 = T1 ; T1 = TRANS_DATE ; end ; if last.GRP_ACCT_NO ; format T1 T2 date9. ; run ;
T1
是最新的TRANS_DATE,T2
是前一个。{/ p>