【问题标题】:SAS - Need to stop code if a column has a value not in a listSAS - 如果列的值不在列表中,则需要停止代码
【发布时间】:2017-01-30 17:42:46
【问题描述】:

我有一个名为CLIENT_ID 的变量。它用于循环一堆代码。问题是宏正在寻找一个特定的客户端列表,如下所示:

%stuff(CLIENTX)
%stuff(CLIENTA)

等等。因此,如果数据中出现新客户端(例如CLIENTY),则该客户端不会包含在输出中。

我愿意:

  1. 对现有客户端列表进行代码检查,并在找到新客户端时停止,输出该客户端的名称以便手动更新宏
  2. 对新客户端进行代码检查,然后自动将它们添加到宏列表中

我知道如何比较以找到新的客户端 ID,如果有一个我正在努力解决的新客户端,它只是停止代码或更新代码。可能第二个是不可能的吧?但我希望至少有某种方法可以解决这个问题。

我完全承认我不是宏专家。

【问题讨论】:

  • 我在可视化程序时遇到了一些麻烦。你能用几个数据点发布一个小例子吗?
  • 我们有一些类似性质的问题,请搜索“数据驱动编程 SAS”。
  • @StuSztukowski - 我认为乔所拥有的会奏效。但我总是愿意接受更多建议。基本上有一个主数据集,其中包含每个客户的所有帐户(可能是数百万)和一堆其他信息。今天的宏使用客户端循环并拉下其中一些字段,然后将所有数据附加在一起。主数据集非常大,这就是我们这样做的原因。但是我们在没有通知的情况下获得了新客户,因此我们的硬编码宏错过了他们。不过,我不完全确定如何在此处获取示例。

标签: macros sas


【解决方案1】:

您想要做的是从您的数据中调用您的宏,而不是从编写的代码中。

所以不是

%yourMacro(clientX)
%yourMacro(clientY)

你这样做:

proc sql;
  select distinct cats('%yourMacro(',clientID,')')
    into :macro_call_list separated by ' '
    from your_Data
  ;
quit;

&macro_call_list.;

您可以将your_data 定向到主数据集(如果您有的话),或者定向到有效客户端列表(如果您将其保存在单独的文件中(例如客户端位置人行横道等))。任何有最新数据的东西。在查询中添加distinct 可以保证每个clientID 只调用一次。然后&macro_call_list 包含所有这些%yourMacro(clientX) 等调用,只需将该引用放入开放代码中即可调用它。

【讨论】:

  • 我在一个小列表上对其进行了测试,它确实有效。我现在正在整个主文件上对其进行测试,该文件有近十亿条记录。它一直在运行,但我认为它会起作用。我宁愿有更长的运行时间而不是一直手动更新。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-31
  • 2021-04-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多