哈希返回整个表 - SAS

时间:2013-12-04 21:59:04

标签: sas

我在数据步骤中使用哈希进行查询,如下所示:

if _n_ = 1 then do;
    if 0 then 
        set TableA;
    declare hash A(dataset: "TableA");
    A.definekey ("UniqueKeyA" );
    A.definedata ("DataA" );
    A.definedone();
end;

if _n_ = 1 then do;
    if 0 then 
        set TableB;
    declare hash B(dataset: "TableB");
    B.definekey ("UniqueKeyB" );
    B.definedata ("DataB" );
    B.definedone();
end;

rcA = A.find(key:UniqueKeyA);
rcB = B.find(key:UniqueKeyB);

当我运行查询时,TableA会按预期返回rcA和数据,但由于某种原因,TableB的哈希会使TableB中的每一列都带有它。这些查询看起来与我完全相同,我不能想到会导致它们采取不同行为的表之间存在任何质的差别,但我对SAS知之甚少。

明确地说,如果我的原始表是

UniqueKeyA      UniqueKeyB
    1                A
    2                B
    3                C

和TableA是

UniqueKeyA    [...Other TableA columns...]   DataA
    1                                          53
    3                    ...                   46

和TableB是

UniqueKeyB    [...Other TableB columns...]   DataB
    B                                         .45
    C                    ...                  .22

我的结果表是

UniqueKeyA      UniqueKeyB   rcA   DataA   rcB   [...Other TableB columns...]   DataB
    1                A        0      53     21
    2                B       513            0                                     .45
    3                C        0      46     0               ...                   .22

这对我来说没有意义,因为哈希看起来非常基本,虽然它们相同但只有其中一个返回每一列。

如果您需要更多信息,请告诉我们,谢谢!

此外,我还有另外一个问题,即这些相同的哈希值会在数据列中输入值,例如,rcA不等于0.问题在于:Hash find method entering values despite returning non-zero - SAS

1 个答案:

答案 0 :(得分:1)

这一行:

if 0 then 
        set TableB;

是列的来源。如果在散列之前没有技术上初始化变量的东西,这是一种避免从散列创建中出现的未初始化变量消息的“懒惰”方式。如果你带来每个变量都没关系,但当然如果你只带2并且你有40,你会得到38个额外的你不想要的。它们是空的,但仍然不需要。

(keep=uniquekey datab)添加到set B语句中,它应该删除那些其他列。