![](/img/trans.png)
[英]SAS EG (SQL) deleting rows where max value in one column using double group by
[英]SAS EG (SQL) deleting rows where max value in one column
我需要刪除最大值為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,或者我想不出的任何其他事情,我會很感激。 謝謝!
你快到了。 你只想要<
:
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 只需執行兩個查詢並在后台為您合並它們。
注意:查詢需要將匯總統計信息與原始數據重新合並。
據我了解,引擎蓋下的實際結果與戈登建議的更“兼容”的版本完全相同; 只是您喜歡輸入更少還是更多兼容的 SQL 代碼的問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.