楼主: peijiamei
2676 4

[原创博文] 表格生成求助(时间日期)data与sql两种方法(一个思路1000币) [推广有奖]

已卖:299份资源

学科带头人

75%

还不是VIP/贵宾

-

威望
3
论坛币
26157 个
通用积分
12.7133
学术水平
217 点
热心指数
343 点
信用等级
210 点
经验
75401 点
帖子
1099
精华
1
在线时间
2016 小时
注册时间
2007-11-15
最后登录
2016-3-21

楼主
peijiamei 发表于 2010-11-25 11:29:41 |AI写论文
5000论坛币
现在已有一个变量date  和两个时间2008-8-15   2008-10-10
现在要生成下面的表格(生成变量n1和n2)

生成规则是:
n1=0 if date是2008-8-15之后的日期中距离2008-8-15最近的日期(这里是2008-08-27),
然后n1向上减去1,向下的话则加1


n2=0 if date是2008-10-10之后的日期中距离2008-10-10最近的日期(这里是2008-10-10),,
然后n2向上减去1,向下的话则加1

daten1n2
2008-6-27-3-6
2008-7-30-2-5
2008-8-5-1-4
2008-8-270-3
2008-9-21-2
2008-9-172-1
2008-10-1030
2009-1-2941
2009-2-2452
2009-3-1363
2009-3-2674
2009-4-285
2009-6-596


求data和sql两种方法实现的程序。

每个程序1000币!(只要算法的思路不同即可视为不同的方法)

好的程序有额外奖励!

最佳答案

pobel 查看完整内容

data have; input date : yymmdd10.; format date yymmdd10.; n1=date-"15Aug2008"d; n2=date-"10Oct2008"d; obs=_n_; cards; 2008-6-27 2008-7-30 2008-8-5 2008-8-27 2008-9-2 2008-9-17 2008-10-10 2009-1-29 2009-2-24 2009-3-13 2009-3-26 2009-4-2 2009-6-5 ; proc sql noprint; select distinct obs into :v1 from have where n1=(select min(n1) from have whe ...
关键词:Data sql date ATEN 生成变量

本帖被以下文库推荐

沙发
pobel 在职认证  发表于 2010-11-25 11:29:42
data have;
   input date : yymmdd10.;
   format date yymmdd10.;
   n1=date-"15Aug2008"d;
   n2=date-"10Oct2008"d;
   obs=_n_;
   cards;
2008-6-27
2008-7-30
2008-8-5
2008-8-27
2008-9-2
2008-9-17
2008-10-10
2009-1-29
2009-2-24
2009-3-13
2009-3-26
2009-4-2
2009-6-5
;

proc sql noprint;
    select distinct obs into :v1 from have where n1=(select min(n1) from have where n1>=0);
        select distinct obs into :v2 from have where n2=(select min(n2) from have where n2>=0);
quit;

data wanted;
    set have;
        n1=obs-&v1;
        n2=obs-&v2;
        drop obs;
run;
已有 2 人评分学术水平 热心指数 信用等级 收起 理由
soporaeternus + 1 + 1 + 1 围观巨额奖金归属......
hopewell + 1 + 1 + 1 让你胃口好,撑死你算了:)

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

和谐拯救危机

藤椅
pobel 在职认证  发表于 2010-11-25 14:03:13
data have;
   input date : yymmdd10.;
   format date yymmdd10.;
   n1=date-"15Aug2008"d;
   n2=date-"10Oct2008"d;
   retain num1 num2;
   num1+(n1<0); lag1=lag(n1);
   num2+(n2<0); lag2=lag(n2);
   if lag1<0 and n1>=0 then  call symputx("num1",num1);
   if lag2<0 and n2>=0 then  call symputx("num2",num2);
   drop num1 num2 lag1 lag2;
   cards;
2008-6-27
2008-7-30
2008-8-5
2008-8-27
2008-9-2
2008-9-17
2008-10-10
2009-1-29
2009-2-24
2009-3-13
2009-3-26
2009-4-2
2009-6-5
;

data wanted;
   set have;
  n1=_n_-&num1-1;
  n2=_n_-&num2-1;
run;
已有 1 人评分论坛币 学术水平 收起 理由
论坛数据分析 + 999 + 1 先欠一个!

总评分: 论坛币 + 999  学术水平 + 1   查看全部评分

和谐拯救危机

板凳
jingju11 发表于 2010-11-26 02:55:10
3# pobel

  1. data had;
  2.    input date : yymmdd10.; format date yymmdd10.;
  3.    cards;
  4. 2008-6-27
  5. 2008-7-30
  6. 2008-8-5
  7. 2008-8-27
  8. 2008-9-2
  9. 2008-9-17
  10. 2008-10-10
  11. 2009-1-29
  12. 2009-2-24
  13. 2009-3-13
  14. 2009-3-26
  15. 2009-4-2
  16. 2009-6-5
  17. ;
  18. data have; drop dif: n n0;
  19. do until(eof);
  20.   set have end =eof;
  21.   n ++1;
  22.   **date cut in dif1 should be always no more than that in dif2;
  23.   dif1 =date- '15Aug2008'd; dif2 =date-'10Oct2008'd;
  24.   if dif1 >=0 then n0 =min(n0, n);  
  25.   if dif2 >=0 then leave;  
  26. end;
  27. do _n_ = 1 to nobs;
  28.   set have nobs =nobs;
  29.   n1 =_n_ -n0;  n2 =_n_ -n;
  30.   output;
  31. end;
  32. run;
复制代码

我的宗旨是在别人的启发下,自己再想一想,是在提高自己。当然哈哈,赏金嘛,其次其次。
已有 4 人评分论坛币 学术水平 热心指数 信用等级 收起 理由
hopewell + 1 + 1 + 1 ++1 :)
pobel + 1 + 1 + 1 精彩!
soporaeternus + 1 + 1 + 1 学习一下,我把have set了两遍......
论坛数据分析 + 999 + 1 先欠一个!

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

报纸
jingju11 发表于 2010-11-26 13:04:39
jingju11 发表于 2010-11-26 02:55
3# pobel
  1. data had;
  2.    input date : yymmdd10.; format date yymmdd10.;
  3.    cards;
  4. 2008-6-27
  5. ...;
  6. data have; drop dif: n n0;
  7. do until(eof);
  8.   set had end =eof; **have -->had;
  9.   n ++1;
  10.   **date cut in dif1 should be always no more than that in dif2;
  11.   dif1 =date- '15Aug2008'd; dif2 =date-'10Oct2008'd;
  12.   if dif1 >=0 then n0 =min(n0, n);  
  13.   if dif2 >=0 then leave;  
  14. end;
  15. do _n_ = 1 to nobs;
  16.   set had nobs =nobs; **have -->had;
  17.   n1 =_n_ -n0;  n2 =_n_ -n;
  18.   output;
  19. end;
  20. run;
复制代码
我--
SOPOR:水就水吧。没有水货,哪有真金?

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

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