我在数据步骤中使用哈希进行查询,如下所示:
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
答案 0 :(得分:1)
这一行:
if 0 then
set TableB;
是列的来源。如果在散列之前没有技术上初始化变量的东西,这是一种避免从散列创建中出现的未初始化变量消息的“懒惰”方式。如果你带来每个变量都没关系,但当然如果你只带2并且你有40,你会得到38个额外的你不想要的。它们是空的,但仍然不需要。
将(keep=uniquekey datab)
添加到set B语句中,它应该删除那些其他列。