找到SAS的第二个最新日期

时间:2015-11-20 00:43:57

标签: sql sas

我有两列:

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;

代码似乎没有得到任何结果。它需要很长时间才能加载。

请帮助!!

5 个答案:

答案 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>