0

浏览SAS Hash Object Declare Statement Doc我可以阅读以下关于很少使用的 Keysum 参数的内容:它“指定跟踪所有键的键摘要的变量的名称。键摘要是对键有多少次的计数在 FIND 方法调用中被引用。”

但是,玩弄它,这似乎有点不对劲。考虑下面的小例子。如果文档准确,则 Keysum 在测试数据集中等于 2(2*find() 方法调用)。但是,它等于 10。

data _null_;
   declare hash h (suminc : 's', keysum : 'keysum');
   h.definekey ('k');
   h.definedone ();

   k = 1;
   s = 2;
   keysum = 0;

   h.add ();
   h.ref ();
   h.ref ();

   h.find ();
   h.find ();

   h.output (dataset : 'test');
run;

这是我自己的解释。每次通过 Add()、Ref() 或 Find() 方法引用键时,Keysum 参数标记中指定的变量都会增加 suminc 变量的值。但是,必须至少存在一个 find() 方法调用才能进行增量。否则,Keysum 不会递增(取出上面的两个 find() 方法调用并验证)。

我的解释是简单地玩弄上面的代码..

那么,哪个更离谱,我的解释还是文档?

4

2 回答 2

0

帮助条目“维护关键摘要”比文档的其他部分更好地解释了这个概念。我的大胆

此 SUMINC 标记指示散列对象分配内部存储空间以维护每个键的汇总值。

每当使用 ADD 或 REPLACE 方法时,哈希键的汇总值都会初始化为 SUMINC 变量的值。

每当使用 FIND、CHECK 或 REF 方法时,哈希键的汇总值都会增加SUMINC 变量的值。

请注意,SUMINC 变量可以是负值、正值或零值。变量不必是整数。默认情况下,键的 SUMINC 值为零。

我不知道为什么通常近乎完美的文档团队不在关于 SUMINC 的其他不完整或不精确的陈述之上。

文档示例代码是漂亮的 Mickey Mouse,更好的 SUMINC 示例是:

  • 使用哈希计算加权频率表(输出数据集以频率为键和)
  • 计算分类帐报表中的运行总计。(用 检索总和.SUM()
  • 输出关联金融交易的总数(输出数据集的总数为keysum)
于 2020-03-06T17:55:03.377 回答
0

@理查德,谢谢。

您是否同意对于启动部分,Ref() 方法也初始化 Keysum 的值?请参阅下面的代码。

data _null_;
   declare hash h (suminc : 's', keysum : 'keysum');
   h.definekey ('k');
   h.definedone ();

   k = 1;
   s = 2;
   keysum = 0;

   h.ref ();

   h.find ();
   h.find ();

   h.output (dataset : 'test');
run;

此外,我是否正确必须存在一个 Find() 方法才能使 Keysum 被初始化和递增?比如下面的输出数据集中Keysum=0

data _null_;
   declare hash h (suminc : 's', keysum : 'keysum');
   h.definekey ('k');
   h.definedone ();

   k = 1;
   s = 2;
   keysum = 0;

   h.add ();

   h.output (dataset : 'test');
run;

另外,我同意,提高文档中示例的复杂性会很好。

于 2020-03-06T18:15:52.047 回答