受问题SAS iterative loops between two datasets的启发,假设我有信用卡借记交易(购买)和信用(付款)的数据集。我想创建一个具有运行余额(直接)的新数据集,并将每个信用分配给特定借记(最旧的借方尚未付清)。
借记数据如:
data debits;
input customerID transactID Date mmddyy10. Amount;
format Date mmddyy10.;
cards;
1 101 01/01/2017 -10
1 102 02/01/2017 -50
2 103 01/01/2017 -10
2 104 02/01/2017 -50
3 105 01/01/2017 -10
3 106 02/01/2017 -50
4 107 01/01/2017 -10
4 108 02/01/2017 -50
;
信用数据如:
data credits;
input customerID transactID Date mmddyy10. Amount;
format Date mmddyy10.;
cards;
1 201 01/15/2017 10
1 202 02/15/2017 50
2 203 02/15/2017 10
2 204 02/20/2017 50
3 205 04/01/2017 5
3 206 05/01/2017 20
3 207 06/01/2017 40
;
Toe获得运行余额,我可以通过customerID和Date交错它们:
data balance;
set debits
credits
;
by customerID Date;
if first.customerID then Balance=0;
Balance++Amount;
run;
这使得:
customer transact
ID ID Date Amount Balance
1 101 01/01/2017 -10 -10
1 201 01/15/2017 10 0
1 102 02/01/2017 -50 -50
1 202 02/15/2017 50 0
2 103 01/01/2017 -10 -10
2 104 02/01/2017 -50 -60
2 203 02/15/2017 10 -50
2 204 02/20/2017 50 0
3 105 01/01/2017 -10 -10
3 106 02/01/2017 -50 -60
3 205 04/01/2017 5 -55
3 206 05/01/2017 20 -35
3 207 06/01/2017 40 5
4 107 01/01/2017 -10 -10
4 108 02/01/2017 -50 -60
我想添加一个变量CreditedDebit。对于每个信用,CreditedDebit将是信用证所用的借方的transactID。对于具有未付余额的该客户的最旧借记交易,将应用贷记。所以我的WANT数据集是:
customer transact
ID ID Date Amount Balance CreditedDebit
1 101 01/01/2017 -10 -10 .
1 201 01/15/2017 10 0 101
1 102 02/01/2017 -50 -50 .
1 202 02/15/2017 50 0 102
2 103 01/01/2017 -10 -10 .
2 104 02/01/2017 -50 -60 .
2 203 02/15/2017 10 -50 103
2 204 02/20/2017 50 0 104
3 105 01/01/2017 -10 -10 .
3 106 02/01/2017 -50 -60 .
3 205 04/01/2017 5 -55 105
3 206 05/01/2017 5 -50 105
3 206 05/01/2017 15 -35 106
3 207 06/01/2017 35 0 106
4 107 01/01/2017 -10 -10 .
4 108 02/01/2017 -50 -60 .
所需数据集显示信用201已应用于借方101,贷记202已应用于借方102等。请注意,某些借方是延迟支付的。一些学分可以应用于多个借记。 CustomerID = 3在5月1日支付20美元(交易206)。在那一天,借方105还剩下5美元,而借方106还剩下50美元。因此,交易206的WANT数据集中有两条记录,显示5美元适用于借方105,15美元适用于借方106。
我无法想出一种合理的方法将每个信用额与其应用的借方相关联。我正在思考像#"加载哈希表(或只是一个数组)以及CustomerID的所有借记,然后读取该CustomerID的每个信用,将每个信用应用于最旧的非零借方每次将贷记应用于借记时输出记录。"但我并不喜欢脑子里的伪代码。