如何实现“最后或第一次”。使用proc sql

时间:2018-01-10 05:20:19

标签: sql sas proc

我正在努力实现“最后一次”。使用Proc SQL而不是数据步骤的功能。假设我有一个如下数据集:

Account_Id Dept Salary Emp_Status Projects Rating
111         123  7000  Perm       A        5
111         123  7000  Perm       B        4
111         123  7000  Perm       C        5
222         124  6000  Perm       A        5
333         125  7000  Perm       B        4
333         125  7000  Perm       C        5

我想在每个account_id的输出中只有一行。所以,我想要last.account_id。我怎样才能使用proc sql实现这一点。我在account_id上进行分组时尝试使用max(monotnic())但是没有用。 有人可以请帮助。此外,由于某些标准项目限制,我无法使用或执行子查询。在proc sql中还有其他方法吗?

提前致谢!

2 个答案:

答案 0 :(得分:0)

以下似乎可以为您发布的样本数据执行所需操作,假设您只关心输入数据集的行顺序而不是任何特定变量的值来确定分组内的顺序: / p>

data have;
input Account_Id Dept Salary Emp_Status $ Projects $ Rating;
cards;
111         123  7000  Perm       A        5
111         123  7000  Perm       B        4
111         123  7000  Perm       C        5
222         124  6000  Perm       A        5
333         125  7000  Perm       B        4
333         125  7000  Perm       C        5
;
run;

proc sql;
  create table want as
    select *, monotonic() as row_id from have
    group by account_id
    having row_id = max(row_id);
quit;

这看起来与您所说的已经尝试过的非常相似,所以如果它不起作用,请提供一些重现问题的示例输入数据。

一般情况下,我建议不要在生产代码中使用monotonic(),因为它没有文档记录,并且可能会在更复杂的查询中导致意外结果。使用sql时,您应该使用变量来定义行顺序。

答案 1 :(得分:0)

您正确地说明SAS SQL中没有自动变量等同于第一个。或者持续。数据需要具有支持组排序中的确定性的列,这些列可用于MAX选择,然后作为连接标准应用。您数据中的Projects可能是候选人:

data have;
input Account_Id Dept Salary Emp_Status $ Projects $ Rating;
datalines;
111         123  7000  Perm       A        5
111         123  7000  Perm       B        4
111         123  7000  Perm       C        5
222         124  6000  Perm       A        5
333         125  7000  Perm       B        4
333         125  7000  Perm       C        5
run;

proc sql;
   * standard sql query;
   create table want as
   select have.*
   from have
   join (select account_id, max(projects) as max_projects from have group by account_id) as matched
     on matched.account_id = have.account_id
        and matched.max_projects = have.projects
   ;

   * SAS sql query that does magic auto remerge ;
   create table want as
   select have.*
   from have
   group by account_id
   having projects = max(projects)   
   ;

我会避免使用monotonic(),特别是在SQL中。该函数未记录,并且不保证在将来的版本中存在或执行等效。您的数据确实需要上下文列来选择组内极值。