SAS EG (SQL) 删除一列中最大值的行

SAS EG (SQL) deleting rows where max value in one column

我需要删除所有最大值为 duty_perd_id 的行,其中 rotn_prng_nbrempl_nbr 相同(彼此不相同,但最大值在哪里这两个保持不变的所有行)。从下面的 table 中删除第 3,7 和 9 行。

rotn_prng_nbr empl_nbr duty_perd_id
B93 12 1
B93 12 2
B93 12 3
B21 12 1
B21 12 2
B21 12 3
B21 12 4
B21 18 1
B21 18 2

使用 SAS EG。目前所有的如下:

选项 1:

 create table middle_legs as
    select t.*
    from actual_flt_leg as t
    where t.duty_perd_id < (select max(t2.duty_perd_id)
                            from actual_flt_leg as t2
                            where t2.rotn_prng_nbr = t.rotn_prng_nbr and
                                  t2.empl_nbr = t.empl_nbr
                           );

这完全符合预期,但速度非常慢。另一个我有但没能完全完成的想法如下。

选项 2:

create table last_duty_day as
Select * from actual_flt_leg 
inner join (
    select actual_flt_leg.Rotn_Prng_Nbr,actual_flt_leg.empl_nbr, max(duty_perd_id) as last_duty
    from actual_flt_leg
    group by actual_flt_leg.Rotn_Prng_Nbr, actual_flt_leg.empl_nbr
) maxtable on 
    actual_flt_leg.Rotn_Prng_Nbr = maxtable.Rotn_Prng_Nbr
    and actual_flt_leg.empl_Nbr = maxtable.empl_Nbr
    and actual_flt_leg.duty_perd_id = maxtable.last_duty;

选项 2 找到给定对的所有最高 duty_perd_id,我想知道是否有任何“反向连接”只能显示原始 table 中不显示的行匹配我在选项 2 中创建的这个新 table。

如果有办法使选项 1 更快,请完成选项 2,或其他任何我想不到的方法,我将不胜感激。谢谢!

你快到了。你只需要 <:

Select *
from actual_flt_leg inner join
     (select actual_flt_leg.Rotn_Prng_Nbr,actual_flt_leg.empl_nbr, max(duty_perd_id) as last_duty
      from actual_flt_leg
      group by actual_flt_leg.Rotn_Prng_Nbr, actual_flt_leg.empl_nbr
     ) maxtable 
     on actual_flt_leg.Rotn_Prng_Nbr = maxtable.Rotn_Prng_Nbr and
        actual_flt_leg.empl_Nbr = maxtable.empl_Nbr and
        actual_flt_leg.duty_perd_id < maxtable.last_duty;

在 SAS SQL 中,这非常简单:

data have;
input rotn_prng_nbr $ empl_nbr duty_perd_id;
datalines;
B93 12 1
B93 12 2
B93 12 3
B21 12 1
B21 12 2
B21 12 3
B21 12 4
B21 18 1
B21 18 2
;;;;
run;

proc sql;
  select *
    from have
    group by rotn_prng_nbr, empl_nbr
    having duty_perd_id lt max(duty_perd_id);
quit;

这在我见过的任何其他系统中都是不合法的 SQL,但它在 SAS 中有效。您可以 group by 一组变量,同时仍然对所有变量使用 select,包括不在分组依据上的变量; SAS 只需执行两个查询并在后台为您合并它们。

NOTE: The query requires remerging summary statistics back with the original data.

据我了解,引擎盖下的实际结果与 Gordon 建议的更“兼容”版本完全相同;只是您喜欢输入更少还是更兼容的 SQL 代码的问题。