首页 > 解决方案 > 在 SAS 中创建带有日期的宏变量

问题描述

我有两个数据集 - 一个具有 accountid 和对应于每个 accountid 的不同日期。数据看起来像这样

帐户ID 开户日期
1234567 2020 年 11 月 21 日
1254268 2020 年 11 月 30 日

第二个数据是交易级别的每日数据,看起来像这样,每个帐户 ID 都有每日余额。

帐户ID 交易日期 客户_巴尔
1234567 2020 年 11 月 21 日 400英镑
1254267 2020 年 11 月 22 日 100英镑
1254268 2020 年 11 月 22 日 50英镑
1254268 2020 年 11 月 23 日 0
1254268 2020 年 11 月 24 日 20英镑
1254268 2020 年 11 月 25 日 45英镑

有50个不同的账户,开户日期不同

我想创建一个宏代码,它从第一个表中获取不同的 accountid,然后从第二个表中获取从开户日期到接下来十天的余额。

我已经为一个日期创建了宏,然后如何从该帐户开立日期创建接下来的十天

proc sql;
select distinct account_open_date into :exec_date from abc 
order by account_open_date;

data _null_;
CALL SYMPUT('run0',put(intnx('day',&run.,0,'s'), yymmddn8.));
CALL SYMPUT('run1',put(intnx('day',&run.,1,'s'), yymmddn8.));
CALL SYMPUT('run2',put(intnx('day',&run.,2,'s'), yymmddn8.));
CALL SYMPUT('run3',put(intnx('day',&run.,3,'s'), yymmddn8.));
CALL SYMPUT('run4',put(intnx('day',&run.,4,'s'), yymmddn8.));
CALL SYMPUT('run5',put(intnx('day',&run.,5,'s'), yymmddn8.));
CALL SYMPUT('run6',put(intnx('day',&run.,6,'s'), yymmddn8.));
CALL SYMPUT('run7',put(intnx('day',&run.,7,'s'), yymmddn8.));
CALL SYMPUT('run8',put(intnx('day',&run.,8,'s'), yymmddn8.));
CALL SYMPUT('run9',put(intnx('day',&run.,9,'s'), yymmddn8.));
CALL SYMPUT('run10',put(intnx('day',&run.,10,'s'), yymmddn8.));
run;

如何将所有不同的 account_open_dates 存储在宏中,然后从每个 accountid 的第二个表中取出接下来十天的交易

标签: datesassas-macro

解决方案


你真的不需要宏来进行这个处理。

一个简单的 SQL 连接将在单个表中获得您需要的所有内容,该表可以在使用语句的步骤PROC或步骤中进行进一步处理。DATABY

例子:

假定日期变量包含 SAS 日期值(从 SAS 日期开始的天数为整数)。

proc sql;
  create table first_ten_days as
  select 
    accounts.account_id
  , accounts.open_date
  , transactions.transaction_date
  , transactions.balance
  from accounts
  join transactions
  on accounts.account_id = transactions.account_id
  where transactions.transaction_date - accounts.open_date <= 10
  order by account_id, transaction_date
  ;

proc ...
  by account_id;
  ...

推荐阅读