SAS EG (SQL) 删除一列中最大值的行
SAS EG (SQL) deleting rows where max value in one column
我需要删除所有最大值为 duty_perd_id
的行,其中 rotn_prng_nbr
和 empl_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 代码的问题。
我需要删除所有最大值为 duty_perd_id
的行,其中 rotn_prng_nbr
和 empl_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 代码的问题。