2016-08-11 81 views
0

我想使用SAS Proc SQL在表中找到我行,其中每列都有一个非缺失值。有没有办法做到这一点,而不必列出所有的列名?这不起作用,但它可能会让你知道我的预期输出是什么。使用SAS Proc SQL查找所有列不丢失的行?

Proc SQL; 
    Select * 
    from work.table 
    Where * is not null; 
Run; 

如果可能,我还想限制结果为一个观察值。谢谢。

回答

0

在SQL,因为你不能在一个项目中的所有变量,而无需使用宏语言平凡的。在datastep中,这是微不足道的。

data class; 
    set sashelp.class; 
    if mod(_n_,3)=1 then call missing(age); 
run; 

data want; 
    set class; 
    if cmiss(of _all_)=0; 
run; 

cmiss指示1,如果一个字符或数字变量缺失(和特别是在这种情况下,计数missings的总数)。您可以使用数据步骤中的obs=1选项将其限制为一个。

+0

这个工作!谢谢。对于将来可能想要使用Joe代码的任何人的记录,只需将if cmiss(of _all_)等于1而不是0,以获得包含所有非缺失值的行。 –

+0

为什么要将它更改为1?那意味着你寻找一行*一个*缺失值。所有的拒绝将是0. – Joe

+0

你是对的。最初cmiss = 0确实没有返回结果,但我现在意识到这是因为原始表中有一列,每一行都有一个缺失值。当我删除该列时,是的,cmiss = 0是正确的。谢谢。 –

0

在SQL中,您必须是显式的。 *不是扩展列的通用宏。它是在select *count(*)中恰好使用的句法元素。

所以,这样的事情:

Proc SQL; 
    Select * 
    from work.table 
    Where col1 is not null and col2 is not null and col3 is not null . . . 
Run; 
1

使用SQL和字典表:

proc sql noprint; 
    select cats('not missing(', name, ')') 
    into :expression separated by " and " 
    from dictionary.columns 
    where libname = "SASHELP" and memname = "CLASS"; 
quit; 

proc sql outobs=1; 
    select * 
    from sashelp.class 
    where &expression.; 
quit;