gpt4 book ai didi

sql - Proc SQL 并通过单个变量删除重复项

转载 作者:行者123 更新时间:2023-12-04 04:46:33 24 4
gpt4 key购买 nike

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;

最佳答案

这不是 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 子查询联合。更慢,取决于 table 的大小;如果这是一个 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,因此如果您更喜欢其他选项,请更改合并语句的顺序。

关于sql - Proc SQL 并通过单个变量删除重复项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18087526/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com