2

好的,我将从问题开始:我每周都会创建产品表,其名称格式为:

products_20130701
products_20130708
.
.
.

我正在尝试自动化一些活动分析,这样我就不必每周手动更改代码中的表名称来使用在我的活动最大结束日期之后的第一个产品表。

例如

%put &max_enddate.; 
/*20130603*/

我六月的产品表是:

products_20130602
*products_20130609*
products_20130616
products_20130623

在这种情况下,我想使用列表中的第二个表,忽略超过 12 个月的产品表,只选择日期在我的 max_enddate 宏之后的表。

我整天都在谷歌搜索,我很困惑,所以任何建议都会非常感激。

谢谢!

4

3 回答 3

2

SQL解决方案:

data product_20130603;
run;

data product_20130503;
run;

data product_20130703;
run;

%let campdate=20130601;

proc sql;
  select min(memname) into :datasetname from dictionary.tables 
  where libname='WORK' and upcase(scan(memname,1,'_'))='PRODUCT' and
  input(scan(memname,2,'_'),YYMMDD8.) ge input("&campdate.",YYMMDD8.);
quit;

现在您有了可以在 set 语句中使用的 &datasetname,所以

    数据 my_analysis; 设置 &datasetname; (无论你在做什么);跑;

将“WORK”修改为适当的库名,如果有任何其他限制,也添加这些限制。如果您有 product_somethingnotadate,您可能会收到一些有关无效日期的警告,但这无关紧要。

它的工作方式 - dictionary.tables 是您访问过的所有库名中所有表的列表(与 sashelp.vtable 相同,但仅在 PROC SQL 中可用)。首先,这会选择所有名称的日期大于或等于您的广告系列结束日期的行;然后它会min(memname)从中得到。Memname 当然是一个字符串,但是在除了数字之外的相同的字符串中,你仍然可以使用min并得到预期的结果。

于 2013-08-02T13:58:48.930 回答
1

这可能不适合您的应用程序,但是我发现它对我拥有的数据集非常有用,因为它们绝对必须在每个星期日都存在,并且我在代码开头评估数据集的存在。如果它们不存在,那么它会向我们的 IT 人员发送一封电子邮件,告诉他们文件丢失并且需要重新创建\恢复。

%LET DSN = PRODUCTS_%SYSFUNC(PUTN(%SYSFUNC(INTNX(WEEK.2,%SYSFUNC(INPUTN(&MAX_ENDDATE.,YYMMDD8.)),0,END)),YYMMDDN8.));

使用上面的其他建议,它们只会为您提供现有数据集的结果,因此,如果您应该使用的数据集已被删除,那么它将抓取下一个数据集并运行该作业。

于 2013-08-05T08:38:24.250 回答
0

首先,获取所有可能的表:

data PRODUCT_TABLES;
    set SASHELP.VTABLE (keep=libname memname);
    *get what you need, here i keep it simple;
    where lowcase(substr(memname,1,9))='products_';
run;

接下来,按日期对其进行排序,由于数据集名称的格式很容易完成。

proc sort data=PRODUCT_TABLES;
    by memname;
run;

最后,你只需要取出日期足够大的第一条记录。

data _NULL_;
    set PRODUCT_TABLES;
    *compare to your macro variable, note that i keep it as simple as possible and let SAS implicitly convert to numeric;
    if substr(memname,10,18)>=symgetn("max_enddate") then do;
        *set your match into a macro variable, i have put together the libname and memname here;
        call symput("selectedTable",cats(libname,'.',memname));
        stop; *do not continue, otherwise you will output simply the latest dataset;
    end;
run;

现在,当您想使用适当的数据集时,您可以只放置宏变量,例如:

data SOME_TABLE;
    set &selectedTable.;
    /*DO SOME STUFF*/
run;
于 2013-08-02T11:37:52.970 回答