PROC SQL 错误地消除了从 Oracle 数据库中提取的缺失值
PROC SQL Incorrectly Eliminating Missing Values in pull from Oracle data base
当我不希望它们被删除时,我所有的缺失值都被删除了。我假设 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 table 提取原始数据:
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 具有二进制逻辑 (true/false)。如果 Final_Grade 在 SAS 中为 null,则 Final_Grade NOT IN ('AU','WU')
将为真。 Oracle 具有三元逻辑(true/false/未知)。如果 Final_Grade 在 Oracle 中为 null,则 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)
SAS 程序员从 RDBMS 读取时遇到的这个问题和许多其他问题在 Mike Rhoads 的一篇不错的论文中得到了解决,http://support.sas.com/resources/papers/proceedings09/141-2009.pdf。
当我不希望它们被删除时,我所有的缺失值都被删除了。我假设 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 table 提取原始数据:
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 具有二进制逻辑 (true/false)。如果 Final_Grade 在 SAS 中为 null,则 Final_Grade NOT IN ('AU','WU')
将为真。 Oracle 具有三元逻辑(true/false/未知)。如果 Final_Grade 在 Oracle 中为 null,则 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)
SAS 程序员从 RDBMS 读取时遇到的这个问题和许多其他问题在 Mike Rhoads 的一篇不错的论文中得到了解决,http://support.sas.com/resources/papers/proceedings09/141-2009.pdf。