根据来自另一个数据集的 PROC SQL 的结果更新 SAS 数据集

Posted

技术标签:

【中文标题】根据来自另一个数据集的 PROC SQL 的结果更新 SAS 数据集【英文标题】:Update SAS dataset based on results from a PROC SQL from another dataset 【发布时间】:2015-08-05 10:08:03 【问题描述】:

这里的新 SAS 用户:我有一个由 PROC SQL 语句创建的数据集(表):

proc sql;
    create table work.dm_1 as
    select distinct a.subject, c.dsyn as DSYN_DS_1, d.dsyn as DSYN_DS_2
    from s_raw.dm_1 a
    left join work.edt_eg b
    on a.subject=b.subjid
    left join s_raw.ds_1 c
    on a.subject=c.subject
    left join s_raw.ds_2 d
    on a.subject=d.subject
    where c.DSYN='NO' and d.DSYN='NO';
quit;

使用此表 (work.dm_1) 中的结果,我想修改另一个(现有)表(work.edt_ecg,从先前的过程创建)以选择匹配记录(使用 dm_1 中的主题和 edt_eg 中的 subjid) proc sql 上面的表,并更新表work.edt_ecg。我尝试了以下方法:

proc sql;
   update table work.edt_eg as
   select * 
   from work.edt_eg where subjid in (select distinct subject from      work.dm_1); 
quit;

但它不适合我!欢迎任何想法

【问题讨论】:

您可能会在使用left join s_raw.ds_1 c 时出错,然后在c.DSYN='NO' 上进行过滤:当没有匹配的c 时,您会从a 中丢失您的observation(1)。你应该写left join s_raw.ds_1 c on a.subject=c.subject and c.DSYN='NO'。您左侧的相同帐户加入 d 【参考方案1】:

您应该使用所需数据的子集创建一个新表或视图

create view work.edt_eg_wanted as
select * 
from work.edt_eg 
where subjid in (select distinct subject from work.dm_1); 

或从现有表中删除所有不需要的观察(1)

delete * 
from work.edt_eg 
where subjid not in (select distinct subject from work.dm_1); 

(由于您没有提供示例数据,因此未测试此代码)

(1) 观察是 SAS 用于表中行的词。这是因为 SAS 最初是由统计学家编写的。

【讨论】:

以上是关于根据来自另一个数据集的 PROC SQL 的结果更新 SAS 数据集的主要内容,如果未能解决你的问题,请参考以下文章

使用空数据集的Spark SQL连接会导致更大的输出文件大小

使用来自另一个数据集的值搜索和更新 Spark 数据集列

使用 JDBC 可调用 stmt 存储 proc 时返回的结果集的顺序是啥?

使用来自两个数据集的变量创建计算字段时 Tableau 中的错误

使用来自另一个 MEF 程序集的类而不引用它

如何根据VS2012上另一个数据网格的选定行在数据网格上显示sql队列结果