楼主: jasper.jin
2238 7

if then do +retain程序求解读,求红色部分程序解读 [推广有奖]

  • 1关注
  • 0粉丝

大专生

20%

还不是VIP/贵宾

-

威望
0
论坛币
61 个
通用积分
0
学术水平
3 点
热心指数
5 点
信用等级
5 点
经验
445 点
帖子
24
精华
0
在线时间
46 小时
注册时间
2016-4-11
最后登录
2021-12-29

楼主
jasper.jin 发表于 2016-10-21 15:20:13 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币
data a;
set b;
by projectid theoryday;

retain overdue_num max_overduedays accu_overduedays accu_liquidateddamages;
if first.projectid then do;
        overdue_num=0;max_overduedays=0;accu_liquidateddamages=0;accu_overduedays=0;
end;
if overduedays>0 then do;
        overdue_num=overdue_num+1;
        if .<actualday<=intnx('month',loanday,time_on_book,'S') and cleanstate in (1,2,3) then
                max_overduedays=max(max_overduedays,overduedays+1);
        else do;
                max_overduedays=max(max_overduedays,intck('day',theoryday,intnx('month',loanday,time_on_book,'S'))+1);
                accu_overduedays=max(accu_overduedays,intck('day',theoryday,intnx('month',loanday,time_on_book,'S'))+1);
        end;
end;
else do;overdue_num=0;max_overduedays=0;accu_overduedays=0;end;
accu_liquidateddamages=accu_liquidateddamages+payedliquidateddamages;
run;

二维码

扫码加我 拉你入群

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

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

关键词:RETAIN 红色部分 Then RET ETA 程序

回帖推荐

DriftKingHan 发表于6楼  查看完整内容

下面是我做的一些注释,供参考有些变量的意义是按照我的经验理解的 要是理解不当的,请见谅 另外,楼主可以告诉一下看的是什么书吗

沙发
yyj_1976 在职认证  企业认证  发表于 2016-10-21 15:34:44
路过,不熟悉这一块,帮不了忙。

藤椅
albertwishedu 发表于 2016-10-21 20:05:13
啥东东?

板凳
Jealy 在职认证  发表于 2016-10-21 20:56:10
路过,可惜这一块儿不熟悉1

报纸
DriftKingHan 发表于 2016-10-21 21:14:29
不知道下面这样加点格式的话,是不是有助于解读
  1. if overduedays > 0 then
  2.         do;
  3.                 overdue_num = overdue_num + 1;
  4.                 if . < actualday <= intnx('month', loanday, time_on_book, 'S') and cleanstate in (1, 2, 3) then
  5.                         max_overduedays = max(max_overduedays,overduedays + 1);
  6.                 else
  7.                         do;
  8.                                 max_overduedays = max(max_overduedays, intck('day', theoryday, intnx('month', loanday, time_on_book, 'S')) + 1);
  9.                                 accu_overduedays = max(accu_overduedays, intck('day', theoryday, intnx('month', loanday, time_on_book, 'S')) + 1);
  10.                         end;
  11.         end;
  12. else
  13.         do;
  14.                 overdue_num = 0;
  15.                 max_overduedays = 0;
  16.                 accu_overduedays = 0;
  17.         end;
  18. accu_liquidateddamages = accu_liquidateddamages + payedliquidateddamages;
复制代码


地板
DriftKingHan 发表于 2016-10-21 22:19:49
下面是我做的一些注释,供参考有些变量的意义是按照我的经验理解的
要是理解不当的,请见谅
另外,楼主可以告诉一下看的是什么书吗

  1. if OverDueDays > 0 then
  2. *当逾期天数大于0时(即有逾期),执行以下的DO语句内容, 3 - 24行;
  3.         do;
  4.                 OverDue_Num = OverDue_Num + 1;        *OverDue_Num自身+1;
  5.                 if . < ActualDay <= INTNX('month', LoanDay, Time_On_Book, 'S') and CleanState IN (1, 2, 3) then
  6.                 *嵌套的IF语句,2个条件,<1> AND <2>
  7.                 <1> ActualDay不为missing,且ActualDay小于等于LoanDay按月加上Time_On_Book的同日日期
  8.                         INTNX('month', LoanDay, Time_On_Book, 'S')返回的结果应该是LoanDay按自然月计算的当前月日期
  9.                         (我理解这个Time_On_Book应该是MOB的概念)
  10.                 <2> CleanState为1,2,3;
  11.                         max_OverDueDays = MAX(max_OverDueDays, OverDueDays + 1);
  12.                         *最大逾期天数 = max_OverDueDays和OverDueDays + 1中的最大值, 更新max_OverDueDays;
  13.                 else
  14.                 *不满足以上的<1> AND <2>时,执行下面的DO语句, 16 - 22行
  15.                 即更新max_OverDueDays和accu_OverDueDays;
  16.                         do;
  17.                         *以下两个语句中INTNX('month', LoanDay, Time_On_Book, 'S')的意思同上
  18.                         语句都可以参照第11行的语句理解,只不过是在里面嵌套了两个公式,分别看就能理解了
  19.                         但实际的意义不太会解释;
  20.                                 max_OverDueDays = MAX(max_OverDueDays, INTCK('day', TheoryDay, INTNX('month', LoanDay, Time_On_Book, 'S')) + 1);
  21.                                 accu_OverDueDays = MAX(accu_OverDueDays, INTCK('day', TheoryDay, INTNX('month', LoanDay, Time_On_Book, 'S')) + 1);
  22.                         end;
  23.                 *嵌套的IF语句结束;
  24.         end;
  25. else
  26. *当逾期天数不大于0时(也就是没有逾期),执行以下的DO语句内容, 27 - 31行;
  27.         do;
  28.                 OverDue_Num = 0;
  29.                 max_OverDueDays = 0;
  30.                 accu_OverDueDays = 0;
  31.         end;
  32. *至此,IF语句结束;
  33. accu_LiquidatedDamages = accu_LiquidatedDamages + PayedLiquidatedDamages;
复制代码



7
dcmc 发表于 2016-10-22 00:39:40
SAS不熟  抱歉一下

8
jasper.jin 发表于 2016-10-26 10:21:23
DriftKingHan 发表于 2016-10-21 22:19
下面是我做的一些注释,供参考有些变量的意义是按照我的经验理解的
要是理解不当的,请见谅
另外,楼主可 ...
里面两个if嵌套 确实让我看的有些懵,你这么解释我就看得懂了,例子不是书本上写的,是别人的项目上写的一些代码。另外,感谢你的精彩解答

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

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