【问题标题】:SAS and proc sqlSAS 和 proc sql
【发布时间】:2013-11-15 12:34:22
【问题描述】:

如果主题满足条件,我必须摆脱它。

数据:

Name Value1 
A      60
A      30
B      70
B      30
C      60
C      50
D      70
D      40

我想要的是如果 value=30 那么这两行都不应该出现在输出中。

想要的输出是

Name Value1 
C      60
C      50
D      70
D      40

我在proc sql中写了一段代码

proc sql;
  create table ck1 as
  select * from ip where name in
     (select distinct name from ip where value = 30)
     order by name, subject, folderseq;
quit;

【问题讨论】:

  • 那么问题是什么?

标签: sql sas proc


【解决方案1】:

将您的 SQL 更改为:

proc sql;
  create table ck1 as
  select * from ip where name not in
     (select distinct name from ip where value = 30)
     order by name, subject, folderseq;
quit;

【讨论】:

    【解决方案2】:

    数据步法:

    data have;
    input Name $ Value1;
    datalines;
    A      60
    A      30
    B      70
    B      30
    C      60
    C      50
    D      70
    D      40
    ;;;;
    run;
    data want;
    do _n_ = 1 by 1 until (last.name);
      set have;
      by name;
      if value1=30 then value1_30=1;
      if value1_30=1 then leave;
    end;
    do _n_ = 1 by 1 until (last.name);
        set have;
        by name;
        if value1_30 ne 1 then output;
    end;
    run;
    

    在某些情况下,另一种稍快的方法可以在 value1_30 为 1 时避免第二个 set 语句(如果大多数情况下,这会更快,特别是如果其中大多数有 30,因此您只保留少量记录)。

    data want;
    do _n_ = 1 by 1 until (last.name);
      set have;
      by name;
      counter+1;
      if first.name then firstcounter=counter;
      else if last.name then lastcounter=counter;
      if value1=30 then value1_30=1;
      if value1_30=1 then leave;
    end;
    if value1_30 ne 1 then
      do _n_ = firstcounter to lastcounter ;
        set have point=_n_;
        output;
      end;
    run;
    

    【讨论】:

      【解决方案3】:

      另一个 SQL 选项...

      proc sql number; 
      select 
      a.name, 
      a.value1, 
      case
      when value1 = 30 then 1
                       else 0
      end as flag,
      sum(calculated flag) as countflagpername
      from have a
      group by a.name
      having countflagpername = 0
      ;quit;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-12-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-11-20
        相关资源
        最近更新 更多