2

这里的 PROC SQL 新手 - 我想使用 Proc SQL 连接(堆栈)来自两个不同数据集的 ID 和 Race 数据,同时还仅按 ID 删除重复项(而不是按 ID 和 Race) - 这可能吗?例如,结合下面的数据后,我只想要 ID=1 的第一个实例(其中 Race=white),而不是 {(1, White) 和 (1, Black)}

样本数据:

DATA SAMPLE1;
    INPUT ID RACE$;
    DATALINES;
    1 WHITE
    2 BLACK
    3 WHITE
    4 BLANK
    ;
RUN; 
DATA SAMPLE2;
    INPUT ID RACE$;
    DATALINES;
    5 HISPANIC
    6 ASIAN
    7 HISPANIC
    8 ASIAN
    1 BLACK
    ;
RUN;
4

3 回答 3

3

这不是 SQL 与普通 SAS 一样擅长的东西,但它肯定是可能的。

几个选项:

外部联接,使用 COALESCE。比其他选项更难编写,因为您必须在初始选择中将每个变量写出两次。

proc sql;
select coalesce(s1.id,s2.id) as id, coalescec(s1.race,s2.race) as race from (
(select * from sample2) s2
full outer join
(select *,"1" as sample1 from sample1) s1
on s2.id=s1.id);
quit;

与 EXISTS 子查询联合。速度较慢,取决于桌子的大小;如果这是一个 10k 表和一个 10 行表,这是一个快速的解决方案;如果是 2 个 10k 表,这很慢。

proc sql;
select * from sample1
union
select * from sample2 where not exists (
  select 1 from sample1 where sample1.id=sample2.id
);
quit;

用 JOIN 联合。可能比上述查询更快,具体取决于索引等。

proc sql;
select * from sample1
union
select sample2.* from sample2 
  left join sample1
  on sample1.id=sample2.id
  where missing(sample1.id);
quit;

但 SAS 中最简单的解决方案无疑是在 SAS 中进行。

data sample12_view/view=sample12_view;
set sample1 sample2;
run;

proc sort nodupkey data=sample12_view out=sample12;
by id;
run;

或者

data sample12;
merge sample1(in=s1) sample2(in=s2);
by id;
run;

在这种情况下,s2 将替换 s1,因此如果您更喜欢其他选项,请更改合并语句的顺序。

于 2013-08-06T19:05:57.810 回答
0

实际上,您应该指定要保留的重复项 - SQL 试图确定性。像这样的东西应该工作:

proc sql;
    create table both_samples as
        select * from (
            (select *
            from sample1 )
            union ( select *
                    from sample2 )
        )
        group by id
        having race = max( race )
    ;
quit;
proc print data = both_samples noobs;
run;

1    WHITE
2    BLACK
3    WHITE
4    BLANK
5    HISPANIC
6    ASIAN
7    HISPANIC
8    ASIAN
于 2013-08-06T19:00:20.767 回答
0

这为您提供了您指定的答案:

proc sql;
create table all as 
    select monotonic() as _n_, * from sample1
union all
    select monotonic() as _n_, * from sample2; 

create table distinct_ids as 
    select id, min(_n_) as _n_ from all group by 1;

create table results as
    select a.id
        ,(select race from all where all.id=a.id and all._n_=a._n_) as race
    from distinct_ids a;
于 2013-08-06T19:11:46.573 回答