楼主: akalius
2044 15

[实际应用] 请大神用简单的方法谢谢这个 [推广有奖]

  • 10关注
  • 3粉丝

讲师

48%

还不是VIP/贵宾

-

威望
0
论坛币
4168 个
通用积分
9.1543
学术水平
4 点
热心指数
6 点
信用等级
6 点
经验
7832 点
帖子
261
精华
0
在线时间
605 小时
注册时间
2009-7-22
最后登录
2024-4-9

楼主
akalius 学生认证  发表于 2017-8-27 18:45:25 |只看作者 |坛友微信交流群|倒序 |AI写论文
200论坛币
codedate1date2varnsumvarn

1

1998/3/22

1999/4/9

66

66

1

1998/6/21

1998/7/19

1

67

1

1998/9/1

1999/3/1

2

68

1

1999/3/8

2001/1/1

9

75

1

1999/5/1

2000/6/1

8

17

2

1996/3/2

1998/8/1

1

1

2

1998/9/3

1999/4/7

8

8

2

1998/10/1

1999/3/4

3

11




规则是,对于同一个code,如果date1小于之前的date2,意味着还未到期,那么则累加满足上面条件的varn,得到sumvarn.



sumvarn是要求出来的啊  , 不是直接带的  ,如果数值与表中所列式的sumvarn不一样,那就说明程序是错的。谢谢


关键词:coded date code Oded ATE
沙发
Strive、 发表于 2017-8-27 18:45:26 |只看作者 |坛友微信交流群
  1. data varn;
  2.     input code date1 date2 varn;
  3.         informat date1 date2 yymmdd10.;
  4.         format date1 date2 yymmdd10.;
  5.     cards;
  6. 1 1998/03/22  1999/04/09  66
  7. 1 1998/06/21  1998/07/19  1
  8. 1 1998/09/01  1999/03/01  2
  9. 1 1999/03/08  2001/01/01  9
  10. 1 1999/05/01  2000/06/01  8
  11. 2 1996/03/02  1998/08/01  1
  12. 2 1998/09/03  1999/04/07  8
  13. 2 1998/10/01  1999/03/04  3
  14. ;
  15. run;

  16. proc sql;
  17.         create table f as select a.code,date1,date2,date3,date4,varn,varn1
  18.                 from varn as a,varn(rename=(date1=date3 date2=date4 varn=varn1)) as b
  19.         where a.code = b.code;
  20. quit;

  21. proc sql;
  22.         create table f1 as select code,date1,sum(varn1) as varn from f
  23.         where date1 < date4 & date1 >= date3
  24.         group by code,date1;
  25. quit;

  26. data final;
  27.         merge varn f1;
  28.         by code date1;
  29. run;
复制代码
已有 1 人评分论坛币 收起 理由
admin_kefu + 20 热心帮助其他会员

总评分: 论坛币 + 20   查看全部评分

使用道具

藤椅
deem 学生认证  发表于 2017-8-27 22:18:50 |只看作者 |坛友微信交流群
  1. data a;
  2.         set a;
  3.         by code;
  4.         retain sumvarn 0;
  5.         if date1 < date2 then sumvarn = sumvarn + varn;
  6.         else sumvarn = .;
  7.         if first.code then sumvarn = 0;
  8.         run;
复制代码

使用道具

板凳
akalius 学生认证  发表于 2017-8-28 08:57:45 |只看作者 |坛友微信交流群
deem 发表于 2017-8-27 22:18
是每个date1 同之前的所有date2对比    不是跟当期的对比

使用道具

报纸
deem 学生认证  发表于 2017-8-28 10:03:19 |只看作者 |坛友微信交流群
akalius 发表于 2017-8-28 08:57
是每个date1 同之前的所有date2对比    不是跟当期的对比
  1. data a;
  2.         set a;
  3.         by code;
  4.         retain sumvarn max_date2;
  5.         max_date2 = max(date2, max_date2);
  6.         if date1 < max_date2 then sumvarn = sumvarn + varn;
  7.         else sumvarn = .;
  8.         if first.code then sumvarn = 0;
  9.         if first.code then max_date2 = date2;
  10.         run;
复制代码

使用道具

地板
baiyaoqian 发表于 2017-8-28 17:08:25 |只看作者 |坛友微信交流群
proc sql;
        select t1.code,
                        t1.date1,
                        t1.date2,
                        t1.varn,
                        sum(t2.varn) as sumvarn
        from a t1
        left join a t2
        on t1.code=t2.code
        and t1.date1<=t2.date2
        and t1.date1>=t2.date1
        group by t1.code,t1.date1,t1.date2,t1.varn
        ;

用sql给出一种解答。

使用道具

7
dlfmc 发表于 2017-8-28 18:36:12 |只看作者 |坛友微信交流群
proc sort data=temp;by code date1 ;run;

data temp1;
        set temp;
        by code date1;
        lag=lag(date2);
        lag1=lag(varn);
        retain max;
        if first.code then max=date2;
        else max= ifc(lag>max,lag,max);
run;

data temp2;
        set temp1;
        by code date1;
        lagmax=lag(max);
        if first.code then lagmax='';
        retain sum;
        if first.code then do;sum=  varn; type=1; end;
        else if lagmax = max and date1<max then do; sum=sum+varn; type=2; end;
        else if lagmax<max and date1<max then do;sum=lag1+varn;  type=3; end;
        else if date1>=max then do;sum=varn; type=4; end;
        keep code date1 date2 varn sumvarn sum type;
run;

看看有没有理解错误
附件是完整program
[attach]2312245

test.txt

946 Bytes

使用道具

8
maggiezzz 发表于 2017-8-28 23:07:49 |只看作者 |坛友微信交流群
data varn;
infile cards;
length date1 $30 date2 $30;
input code date1 $ date2 $ varn;
date1=input(date1,yymmdd10.);
date2=input(date2,yymmdd10.);
cards;
1 1998/3/22  1999/4/9  66
1 1998/6/21  1998/7/19  1
1 1998/9/1   1999/3/1   2
1 1999/3/8   2001/1/1   9
2 1996/3/2   1998/8/1   1
2 1998/9/3   1999/4/7   8
2 1998/10/1  1999/3/4   3
;
run;

/*规则是,对于同一个code,如果date1小于之前的date2,意味着还未到期,那么则累加满足上面条件的varn,得到sumvarn*/

data sumvarn;
  set varn;
  by code;
  retain sumvarn 0;
  if first.code then sumvarn = 0;
  if date1 < date2 then sumvarn = sumvarn + varn;
  else sumvarn = .;
run;


使用道具

9
baiyaoqian 发表于 2017-8-29 09:48:32 |只看作者 |坛友微信交流群
maggiezzz 发表于 2017-8-28 23:07
data varn;
infile cards;
length date1 $30 date2 $30;
data varn;
        infile cards;
        length date11 $18. date22 $18.;
        input code date11 date22 varn;
        date1=input(date11,yymmdd10.);
        date2=input(date22,yymmdd10.);
        drop date11 date22;
        cards;
1 1998/3/22  1999/4/9  66
1 1998/6/21  1998/7/19  1
1 1998/9/1   1999/3/1   2
1 1999/3/8   2001/1/1   9
2 1996/3/2   1998/8/1   1
2 1998/9/3   1999/4/7   8
2 1998/10/1  1999/3/4   3
;
run;


额,你这测了么?
导入数据都有问题!
更新了一下
已有 1 人评分论坛币 学术水平 热心指数 信用等级 收起 理由
akalius + 5 + 2 + 2 + 2 精彩帖子

总评分: 论坛币 + 5  学术水平 + 2  热心指数 + 2  信用等级 + 2   查看全部评分

使用道具

10
maggiezzz 发表于 2017-8-30 10:28:51 |只看作者 |坛友微信交流群
baiyaoqian 发表于 2017-8-29 09:48
data varn;
        infile cards;
        length date11 $18. date22 $18.;
测了啊我生成dataset varn了啊.....

使用道具

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

本版微信群
加好友,备注cda
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-4-20 11:15