【问题标题】:How to make a SAS DIS job loop over rows of a parameter table如何使 SAS DIS 作业循环遍历参数表的行
【发布时间】:2015-04-24 19:23:15
【问题描述】:

我有一个 SAS DIS 作业,它提取和处理一些带时间戳的数据。这项工作的性质是,必须逐月一次处理一点数据。我可以使用时间过滤器来确保任何给定的运行都在所需的时间范围内,但是我必须手动更改该表的参数并逐月重新运行作业,直到处理完所有数据。

由于时间框架可以追溯到很久以前,我想尽可能地自动化这个过程。理想情况下,我有一个表格,表格如下:

time_parameter_1 time_parameter_2
2JAN2010       1FEB2010
2FEB2010       1MAR2010
...            ...

这可能是迭代作业的一部分,该作业继续执行我的处理作业,并使用此表的值作为时间参数,直到表用完。

据我了解,SAS DIS 中的循环转换旨在循环遍历表,而不是表的行。是将每个日期放在单独的表格中的解决方案,还是有直接的方法来实现这一点?

非常感谢。

编辑

所以,在Sushil的帖子的帮助下,我确定了一个解决方案。首先,SAS DIS 似乎需要将日期参数作为文本传递,然后转换为所需的日期格式(至少,这是我可以让事情正常工作的唯一方法)。

程序如下:

在要循环的作业的网格视图中,右键单击并选择属性。导航到参数选项卡并选择新建组。在“常规”选项卡中命名参数(让我们使用 control_start_date)并在“提示类型和值”选项卡中选择提示类型“文本”。按 OK 并使用相同的方法添加任何其他参数(假设 control_end_date 是另一个参数)。

创建一个将循环参数化作业的控制作业。导入或创建要循环的参数(日期)表。这些应该是日期的字符表示。

将参数表连接到 Loop 转换,将参数化作业连接到 Loop 转换的右端,并将参数化作业的右端连接到 Loop End 转换。

右键单击循环转换并选择属性。选择参数映射选项卡并将控制表日期列正确映射到参数化作业的参数(control_start_datecontrol_end_date)。在 Target Table Columns 选项卡中,确保参数列映射到目标表。选择确定。

在参数化作业中,创建用户编写的代码转换。创建列start_dateend_date(键入DATE9.)并使用以下代码填充输出工作表:

DATA CONTROL_DATES;

    start_date = input(trim("&control_start_date"),DATE9.);
    end_date = input(trim("&control_end_date"),DATE9.);

RUN;

将工作表WORK.CONTROL_DATES 中的日期连接到作业的逻辑(可能使用连接),以便它们充当所需容量的过滤器。保存参数化作业。

现在运行控制作业应该能够使用指定的日期过滤器循环作业。

以下PDF 中描述了其中的很多内容,但我不确定该链接将存在多长时间,并且我遇到的一些问题没有在此处得到解决。

【问题讨论】:

    标签: sas sas-dis


    【解决方案1】:

    您对 LOOP 转换的理解不正确。您不需要单独的表格进行循环转换来使您的参数化作业流程循环。具有时间参数的表可以作为循环变换的输入,参数化的作业可以基于控制表(循环变换的输入表)循环。

    这是循环转换的示例用法,它与 SAS DI Studio 文档中提到的不同,并且与您的问题相关:PDF

    如果有帮助请告诉我!

    【讨论】:

    • 嘿苏希尔。我无法按照该文档进行工作。我怀疑我只是需要一些时间来消化内容,但现在压力已经达到我的目标,所以我暂时采取蛮力的方法,然后重新审视文档。不过现在 +1,非常感谢!
    • 嘿苏希尔。我已经设置了循环作业。要循环的作业中的参数是control_start_datecontrol_end_date,并且是日期类型。当我尝试使用提示的测试值运行作业时,我收到错误消息“无效的日期/时间/日期时间常量'&control_start_date'D”。我应该使用另一个表达式来引用作业参数吗?谢谢!
    • 当您在参数化作业流程中使用参数时(将会循环),您似乎遇到了错误。如果在控制表变量 control_start_date & control_end_date 格式为 date9。那么参数化作业流程中参数的使用将类似于 my_date >= "&control_start_date"D 。如果控制表没有日期格式,则用法类似于 my_date >= %unquote(&control_start_date) 。请注意,my_date 是虚拟表上的日期列。
    • 如果您仍然遇到问题,请尝试在参数化作业流程中添加 USER WRITTEN 转换并将 %PUT USER;在转换中查看值是如何解析的。
    • 嘿苏希尔。让我们暂时忘记控制工作。仅在参数化作业本身上,我有参数control_start_datecontrol_end_date,它们的类型为 Date,并被赋予了测试值。在用户编写的代码转换中,我有指令:start_date = '&control_start_date'D。正是这条指令给出了上述错误。我的日期应该编码为字符吗?如果是这样,你知道应该怎么做吗?非常感谢!
    猜你喜欢
    • 2016-05-23
    • 1970-01-01
    • 2017-10-31
    • 2017-11-01
    • 2015-03-07
    • 1970-01-01
    • 2014-01-09
    • 1970-01-01
    • 2011-07-19
    相关资源
    最近更新 更多