SAS DATA STEP:不使用first / last而对多行进行子集化

时间:2016-01-05 16:09:15

标签: sql oracle sas subset

我试图在给定子集数据的情况下拉回所有MAX实例.... first.id或last.id不起作用,因为我想保留同一事务的多行。例如:

TableView_of_Data

在这个例子中,我希望突出显示的行作为输出。我的数据有几个FORM,QUARTER和CUST_ID我想根据FORM,QUARTER,CUST_ID

以编程方式将SAS拉回最新版本

Last.DB_ID只返回1行。我需要相同DB_ID的所有行。

这也没有做任何事情:

data work.want;
set work.have;
by FORM Quarter Cust_ID DB_ID ;
if Max(DB_ID) then output;
run;

1 个答案:

答案 0 :(得分:0)

您需要对数据进行两次传递:一次确定该ID的最大值,另一次查找具有该最大值的行。

在数据步骤中执行此操作需要DoW循环,该循环每个cust_id值运行一次数据步骤迭代,但两次遍历数据集。

data want;
  do _n_ = 1 by 1 until (last.cust_id);
    set have;
    by form quarter cust_id;
    if last.cust_id then max_db_value=db_id;
  end;
  do _n_ = 1 by 1 until (last.cust_id);
    set have;
    by form quarter cust_id;
    if db_id = max_db_Value then output;
  end;
run;

如果DB_ID按照您的示例中的顺序进行排序,则可以正常工作。如果它没有排序,您可以将当前存储的max_db_value与当前db_id进行比较,如果它更高,则将db_id中的新值分配给它,如

max_db_value = max(db_id, max_db_value);

而不是在last.cust_id为真时指定它。