【问题标题】:SAS EG (SQL) deleting rows where max value in one columnSAS EG(SQL)删除一列中有最大值的行
【发布时间】:2021-08-30 13:19:34
【问题描述】:

我需要删除最大值为duty_perd_id 的所有行,其中rotn_prng_nbrempl_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,或者我想不出的任何其他事情,我很感激。谢谢!

【问题讨论】:

    标签: sql sas proc-sql


    【解决方案1】:

    你快到了。你只想要&lt;:

    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;
    

    【讨论】:

    • 我倾向于将&lt; 放在where 中而不是on 中,因为它更能描述你真正想要的内容(“加入这两个东西以获得这个值表,然后选择值小于另一个值的行”) - 尽管我想应该在引擎盖下工作相同。
    【解决方案2】:

    在 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 只是执行两个查询并在后台为您合并它们。

    注意:查询需要将汇总统计信息与原始数据重新合并。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-02
      • 2011-04-06
      • 2022-01-07
      • 1970-01-01
      • 1970-01-01
      • 2016-11-15
      相关资源
      最近更新 更多