SAS和proc sql

SAS和proc sql,sql,sas,proc,Sql,Sas,Proc,如果一个主题满足一个条件,我就必须把它去掉 数据: 我想要的是,如果值=30,那么这两行不应该输入输出 期望输出为 Name Value1 C 60 C 50 D 70 D 40 我已经用procsql编写了一段代码 proc sql; create table ck1 as select * from ip where name in (select distinct name from ip where value = 30)

如果一个主题满足一个条件,我就必须把它去掉

数据:

我想要的是,如果值=30,那么这两行不应该输入输出

期望输出为

Name Value1 
C      60
C      50
D      70
D      40
我已经用procsql编写了一段代码

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更改为:

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;
将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;
将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;
将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;
数据步进法:

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 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 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 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,则速度更快,因此只保留少量记录)

另一个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;
另一个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;
另一个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;
另一个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;

问题是什么?问题是什么?问题是什么?问题是什么?问题是什么?