【发布时间】:2021-08-30 13:19:34
【问题描述】:
我需要删除最大值为duty_perd_id 的所有行,其中rotn_prng_nbr 和empl_nbr 相同(彼此不同,但是这两个行的最大位置保持不变)。从下表中它应该删除第 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,我想知道是否有任何“反向连接”只能显示原始表中与我在选项中创建的新表不匹配的行2.
如果有办法让选项 1 更快,请完成选项 2,或者我想不出的任何其他事情,我很感激。谢谢!
【问题讨论】: