PROC SQL - 跨变量计算不同的值

时间:2015-05-10 11:25:47

标签: sas

寻找使用PROC SQL计算跨多个列/变量的不同条目的方法,我所遇到的是如何计算值的组合。 但是,我想搜索2个(字符)列(在符合特​​定条件的行中)并计算出现在任何中的不同值的数量。

考虑一个如下所示的数据集:

DATA have;
INPUT       A_ID    C   C_ID1 $ C_ID2 $;
DATALINES;
            1       1   abc         .
            2       0   .           .
            3       1   efg         abc
            4       0   .           .
            5       1   abc         kli
            6       1   hij         .
;
RUN;

我现在想要一个包含nr计数的表。在 C = 1的行中 C_ID1 C_ID2 中的唯一值。 结果应为4(abc,efg,hij,kli):

nr_distinct_C_IDs
4

到目前为止,我只能处理一列( C_ID1 ):

PROC SQL;
    CREATE TABLE try AS
          SELECT 
        COUNT (DISTINCT 
            (CASE WHEN C=1 THEN C_ID1 ELSE ' ' END)) AS nr_distinct_C_IDs
                FROM have;
QUIT;

(请注意,我使用CASE处理而不是WHERE子句,因为我的实际PROC SQL也处理同一查询中的其他情况。)

这给了我:

nr_distinct_C_IDs
3

如何将此扩展为两个变量(在我的示例中为 C_ID1 C_ID2 )?

1 个答案:

答案 0 :(得分:0)

我认为在这种情况下,如果您的优先级是想出一些容易扩展到大量变量的东西,那么数据步骤可能更合适。 E.g。

data _null_;
    length ID $3;
    declare hash h();
    rc = h.definekey('ID');
    rc = h.definedone();
    array IDs $ C_ID1-C_ID2;
    do until(eof);
        set have(where = (C = 1)) end = eof;
        do i = 1 to dim(IDs);
            if not(missing(IDs[i])) then do;
                ID = IDs[i];
                rc = h.add();
                if rc = 0 then COUNT + 1;   
            end;
        end;
    end;
    put "Total distinct values found: " COUNT;
run;

这里需要做的就是容纳另一个变量,就是将它添加到数组中。

N.B。因为这使用了一个哈希对象,你需要足够的内存来保存你期望找到的所有不同的值。另一方面,它只读取输入数据集一次,不需要排序,因此它可能比需要多次内部读取和排序的SQL方法更快。