楼主: tyaer
2407 9

如何递归计算银行这样的数据,谢谢 [推广有奖]

  • 3关注
  • 3粉丝

已卖:866份资源

讲师

45%

还不是VIP/贵宾

-

威望
0
论坛币
4880 个
通用积分
9.7412
学术水平
1 点
热心指数
3 点
信用等级
0 点
经验
5996 点
帖子
663
精华
0
在线时间
233 小时
注册时间
2005-12-10
最后登录
2024-7-25

楼主
tyaer 发表于 2013-7-11 09:56:22 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
如何递归计算银行这样的数据,谢谢。

例如:银行持借记卡人的交易明细数据
name transaction_index month   balance
张三 123456789         201101  100
张三 223456789         201102  200
张三 323456789         201103  300
张三 423456789         201104  400
张三 523456789         201105  500
张三 623456789         201103  600
李四 12345678         201201  1000
李四 22345678         201202  2000
李四 32345678         201205  3000
李四 42345678         201106  4000
李四 52345678         201108  5000

想要得到的结果是  计算每一笔交易对应的过去三月的余额总和
最终是这样的结果
name transaction_index month   balance  last3mth_bal_sum
张三 123456789         201101  100      100
张三 223456789         201102  250      100
张三 323456789         201103  300      100+250
张三 423456789         201104  400      100+250+300
张三 523456789         201105  500      250+300+400
张三 623456789         201106  600      300+400+500
李四 12345678           201201  1000      1000
李四 22345678           201202  2500      1000
李四 32345678           201205  3000      2500
李四 42345678           201106  4000      3000
李四 52345678           201108  5000      3000+4000

计算时要考虑和他相邻的前三个月的数据。谢谢各位达人。
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:Transaction balance Action lance month balance 借记卡 如何

本帖被以下文库推荐

  • · sas|主题: 59, 订阅: 14
卖油翁说:“无他,唯熟耳!”

沙发
C100 发表于 2013-7-11 10:40:40
data b;
        set a;
        by name;
        retain last3;
        if first.name  THEN last3=balance;
        else last3+balance;
run;

藤椅
纯洁理想奋斗 在职认证  发表于 2013-7-11 11:48:20
提示: 作者被禁止或删除 内容自动屏蔽
签名被屏蔽

板凳
tyaer 发表于 2013-7-11 12:47:43
谢谢楼上2位,2楼的是算累加。
卖油翁说:“无他,唯熟耳!”

报纸
yongyitian 发表于 2013-7-11 12:59:38
  1. data test;
  2. input name : $8. transaction_index $9. month  balance;
  3. datalines;
  4. ZhangSan 123456789 201101  100
  5. ZhangSan 223456789 201102  200
  6. ZhangSan 323456789 201103  300
  7. ZhangSan 423456789 201104  400
  8. ZhangSan 523456789 201105  500
  9. ZhangSan 623456789 201106  600
  10. ZhangSan 623456789 201107  700
  11. ZhangSan 623456789 201108  800
  12. ZhangSan 623456789 201109  900
  13. LiSi 12345678 201201  1000
  14. LiSi 22345678 201202  2000
  15. LiSi 32345678 201205  3000
  16. LiSi 42345678 201106  4000
  17. LiSi 52345678 201108  5000
  18. ;
  19. run;

  20. proc sort data=test out=test_sort;
  21. by name month;
  22. run;

  23. data want;
  24.   set test_sort;
  25.   by name;
  26.   retain L3_balance 0;
  27.   if first.name then do;
  28.     count=0; L3_balance=0;
  29.     end;
  30.   count+1;                  
  31.   Last1=lag1(balance);
  32.   Last2=lag2(balance);
  33.   Last3=lag3(balance);
  34.   if count = 1 then L3_balance = balance;  
  35.   if count = 3 then L3_balance = Last1 + last2;  
  36.   if count gt 3 then L3_balance = sum(last1, last2, last3);  
  37.   drop count last1 last2 last3;  
  38. run;
复制代码

地板
pobel 在职认证  发表于 2013-7-11 13:27:17
data a;
input name : $ transaction_index : $10. month : $6. balance ;
cards;
A 123456789         201101  100      
A 223456789         201102  250      
A 323456789         201103  300      
A 423456789         201104  400      
A 523456789         201105  500      
A 623456789         201106  600      
B 12345678           201201  1000     
B 22345678           201202  2500     
B 32345678           201205  3000     
B 42345678           201206  4000     
B 52345678           201208  5000     
;


data b;
   set a;
   by name month;
   month_n=substr(month,1,4)*12+substr(month,5,2);
   last3mth_bal_sum=sum((lag(balance)*(dif(month_n)<=3))
                         ,(lag2(balance)*(dif2(month_n)<=3))
                                         ,(lag3(balance)*(dif3(month_n)<=3)));
   if first.name then last3mth_bal_sum=balance;
run;
和谐拯救危机

7
tyaer 发表于 2013-7-11 13:40:54
楼上谢谢
卖油翁说:“无他,唯熟耳!”

8
最无知的幻想々 发表于 2013-8-6 12:56:42
呼呼。。没有公式吗、?

9
ECNU_zf 发表于 2013-8-6 14:17:25


/*计算过去三个个月的消费总额*/
data a;
input name : $ t : $10. month : $6. balance ;
cards;
A 123456789         201101  100      
A 223456789         201102  250      
A 323456789         201103  300      
A 423456789         201104  400      
A 523456789         201105  500      
A 623456789         201106  600      
B 12345678           201107  1000     
B 22345678           201104  2500     
B 32345678           201105  3000     
B 42345678           201106  4000     
B 52345678           201108  5000     
;
run;
proc sort data=a;
by name month;
run;
data want;
set a;by name;
if first.name then do;x1=balance;x2=0;x3=0; end;
x1=(lag(balance))*(lag(name)=name)*(dif(month)<=3);
x2=(lag2(balance))*(lag2(name)=name)*(dif2(month)<=3);
if x1=. then x1=0;
if x2=. then x2=0;
if x3=. then x3=0;
total=x1+x2+balance;
run;

10
tyaer 发表于 2013-8-7 15:31:29
ECNU_zf 发表于 2013-8-6 14:17
/*计算过去三个个月的消费总额*/
data a;
input name : $ t : $10. month : $6. balance ;
ecnu
Good
卖油翁说:“无他,唯熟耳!”

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2025-12-31 19:31