【问题标题】:PROC SQL Incorrectly Eliminating Missing Values in pull from Oracle data basePROC SQL 错误地消除了从 Oracle 数据库中提取的缺失值
【发布时间】:2016-06-18 18:40:37
【问题描述】:

当我不希望它们被删除时,我所有的缺失值都会被删除。我假设 SAS 和 Oracle 表现不佳 - 但我不知道解决方案。感谢您提供有关此错误的任何想法。

观察字符字段 SEX 有缺失值:

data test ;
  input name $ sex $ age city $;
  if sex = "NA" then sex=' ';
  if city = "Unk" then city = ' ';
  cards;
Gene  M  62 Saginaw
Cyndi F    45 Unk 
Alice  NA  51 Bay City       
Bob   M   55 Unk
;
proc print data=test; run; 

观察我可以过滤 SEX 并且仍然有缺失值:

proc sql; 
create table que1 as 
select * from test where sex 
not in ('F','M'); 
quit;
proc sql; select * from que1; quit;

通过 libname 连接观察从 Oracle 表中提取的普通数据:

proc sql; 
create table test as 
select * from dss.student_registrations
where term_code gt '201500'
  and row_type = 'E'
/*  and final_grade not in ('AU','WU') */
;quit;
proc freq data=test; tables final_grade / missing; run; 

现在我对 final_grade 设置了限制,所有缺失的值都消失了:

proc sql; 
create table test as 
select * from dss.student_registrations
where term_code gt '201500'
  and row_type = 'E'
  and final_grade not in ('AU','WU')
;quit;
proc freq data=test; tables final_grade / missing; run; 

【问题讨论】:

    标签: sas missing-data proc-sql


    【解决方案1】:

    SAS 具有二进制逻辑(真/假)。如果 SAS 中的 Final_Grade 为空,Final_Grade NOT IN ('AU','WU') 将为真。 Oracle 具有三元逻辑(真/假/未知)。如果在 Oracle 中 Final_Grade 为空,Final_Grade NOT IN ('AU','WU') 将是未知的。

    虽然您正在编写 SAS 代码,但它会将代码传递给 Oracle 进行处理。建议你试试:

    where term_code gt '201500'
    and row_type = 'E'
    and (final_grade not in ('AU','WU') or final_grade is Null)
    

    Mike Rhoads 在一篇精彩的论文http://support.sas.com/resources/papers/proceedings09/141-2009.pdf 中解决了 SAS 程序员阅读 RDBMS 时遇到的这个问题和许多其他问题。

    【讨论】:

    • 嗯,这很有趣。根据我的阅读,有时 SAS 进程 / 有时 Oracle 进程取决于您是否编写 Oracle 兼容查询(没有 SAS 特定语言)。如果我使用特定于 SAS 的函数,我想它会返回预期的结果。我得玩一下。谢谢。
    • 这是真的。出于这个原因,我通常会避免隐式传递。我喜欢控制 SAS 是在进行处理还是远程数据库。
    • 要强制 SAS 进行所有处理,请在 libname 语句中使用选项:direct_sql = none ... per support.sas.com/documentation/cdl/en/acreldb/68028/HTML/default/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-30
    • 1970-01-01
    • 1970-01-01
    • 2012-11-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多