首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用IN实现数据步骤合并的PROC SQL等效

使用IN实现数据步骤合并的PROC SQL等效
EN

Stack Overflow用户
提问于 2021-03-05 17:15:45
回答 1查看 135关注 0票数 0

我必须合并两个非常大的文件,我希望避免在数据步骤中这样做,因为这意味着对数据进行排序。我需要左文件中所有in的所有观察,不包括不在第二个文件中的in。

代码语言:javascript
复制
data leftdata;
input id $ y;
datalines;
AA 10 
AA 20
BB 30
BB 40
CC 50
CC 80
DD 60
;run;

data rightdata;
input id $ ;
datalines;
AA  
BB
;
run;

*Using datastep;
PROC SORT DATA=leftdata; BY id; 
PROC SORT DATA=rightdata; BY id; RUN;
DATA datastep; 
MERGE leftdata(IN=a) rightdata(IN=b); 
BY id;  IF a and b=0; 
RUN;

如何使用PROC实现相同的目标?

最后的产出必须包括以下意见:

代码语言:javascript
复制
CC 50
CC 80
DD 60
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-03-05 18:14:30

以下是两种方法:

  • WHERE NOT IN (SELECT ...)过滤,or
  • LEFT JOIN,其中缺少正确的id.

示例:

代码语言:javascript
复制
data have;
input id $ y;
datalines;
AA 10 
AA 20
BB 30
BB 40
CC 50
CC 80
DD 60
;

data excluded_ids;
input id $ ;
datalines;
AA  
BB
;

proc sql;
  create table want as
  select * from have
  where id not in (select id from excluded_ids)
  ;

  create table want as
  select have.* from have
  left join excluded_ids as remove
  on have.id = remove.id
  where remove.id is null
  ;

对于第二种方式,如果排除列表具有重复的id,则需要一个SELECT DISTINCT

数据步骤

使用哈希对象存储排除列表和check方法以测试是否删除

示例:

代码语言:javascript
复制
data want;
  set have;
  
  if _n_ = 1 then do;
    declare hash exclude(dataset:'excluded_ids');
    exclude.defineKey('id');
    exclude.defineDone();
  end;

  if exclude.check() = 0 then delete;
run;
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66496825

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档