楼主: 2008310148
4477 13

[求助]请问如何提取某一条记录前后各30条的记录 [推广有奖]

  • 0关注
  • 0粉丝

春香毒

大专生

30%

还不是VIP/贵宾

-

威望
0
论坛币
32 个
通用积分
0.0003
学术水平
0 点
热心指数
2 点
信用等级
0 点
经验
394 点
帖子
68
精华
0
在线时间
5 小时
注册时间
2009-2-27
最后登录
2012-3-7

楼主
2008310148 发表于 2009-3-11 15:10:00 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币

各位高手:

       我的题目是比较基金分红前后三十天内业绩有无显著区别,目前的数据有:

       基金每日的业绩,所在的具体日期(tdatec),分红的具体日期ddatec(均已经转换为日期型)

       现在就想输出分红日前后三十天内的业绩数据(所有数据已经按代码和日期排好序)。

     格式大致如下:

     symbol     sname           unv               tdatec            ddatec

     000001    华夏成长        1            18DEC2001           .

      000001    华夏成长       1             18DEC2001           .

      ........

      000001    华夏成长     1.065        27JUN2002         27JUN2002 

unv代表基金单位净值,不是分红日ddatec就为缺失值,上例中2002.6.27是分红日,现在想要输出这一天前后各三十天的记录怎么办?

[em06]

[此贴子已经被作者于2009-3-11 15:12:20编辑过]

二维码

扫码加我 拉你入群

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

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

关键词:如何提取 symbol date 华夏成长 name 记录

回帖推荐

林嘉祥 发表于7楼  查看完整内容

create table xxx as select a.*, b.tdatec from a(drop=tdatec), (select symbol, tdatec from a where tdatec ne .) as b where a.symbol=b.symbol and tdatec-31<ddatec<tdatec+31; [此贴子已经被作者于2009-3-12 4:58:31编辑过]

wolfcrying 发表于4楼  查看完整内容

晕,还excel呢,可以用SQL比较简单proc sql; create table newdata as select distinct * from dataset    group by symbol,sname   having max(ddatec)-29<=tdatec<=max(ddatec)+30;quit;

wolfcrying 发表于11楼  查看完整内容

你可以玩得在高级一点. 用pointdata out;   set old point=i nobs=tot;   if ddatec~=. then do k=i-30 to i+30;         set old point=k;         output;   end;end;stop;run;记得一定要用stop 啊,否则会死循环的.

本帖被以下文库推荐

沙发
xuwei2007 发表于 2009-3-11 15:51:00
obs&nbsp; obsfirst

藤椅
rdlt_yb 发表于 2009-3-11 21:46:00
可以尝试利用excel的数据汇总功能。
天苍苍,野茫茫,风吹草低见流氓

板凳
wolfcrying 发表于 2009-3-11 22:12:00

晕,还excel呢,

可以用SQL比较简单

proc sql;

 create table newdata as

 select distinct * from dataset

   group by symbol,sname

   having max(ddatec)-29<=tdatec<=max(ddatec)+30;

quit;

已有 1 人评分经验 论坛币 收起 理由
bakoll + 3 + 3 精彩帖子

总评分: 经验 + 3  论坛币 + 3   查看全部评分

报纸
yongyitian 发表于 2009-3-11 22:55:00
Do you&nbsp;mean you want use ORDER BY&nbsp;instead of&nbsp;GROUP BY?

地板
2008310148 发表于 2009-3-12 00:45:00
谢谢,但是这个作为比较的日期不是最后一天,max(ddatec)应该是最后的那天吧?是其中一天的前后三十天啊

7
林嘉祥 发表于 2009-3-12 04:55:00

create table xxx as
 select a.*, b.tdatec
 from a(drop=tdatec), (select symbol, tdatec from a where tdatec ne .) as b
 where a.symbol=b.symbol and tdatec-31<ddatec<tdatec+31;

[此贴子已经被作者于2009-3-12 4:58:31编辑过]

已有 1 人评分经验 论坛币 收起 理由
bakoll + 3 + 3 精彩帖子

总评分: 经验 + 3  论坛币 + 3   查看全部评分

平生无大志,唯吃饱ZB,喂饱JB耳!

8
yongyitian 发表于 2009-3-12 11:10:00

If yourdata has only one value of ddatec that is not NULL, and the 30 days are calendar days
you can use the following code to test your results.

data _null_;
    set yourdata;
    if ddatec ^= null then do;
     call symput('start_date', tdatec - 30);
     call symput('end_date', tdatec + 30);
     end;
run;
data selected_data;
    set yourdata;
 where tdatec >= &start_date and tdatec <= &end_date;
run;

9
2008310148 发表于 2009-3-12 18:58:00

谢谢林嘉祥!我找到了一个代码差不多和你写的一样。

这个代码若要执行成功ddatec是必须在另外一个数据集中么?

如果和tdatec在同一个数据集中可以么?

10
wolfcrying 发表于 2009-3-13 13:34:00

你可以玩得在高级一点. 用point

data out;

  set old point=i nobs=tot;

   if ddatec~=. then do k=i-30 to i+30;

         set old point=k;

         output;

   end;

end;

stop;

run;

记得一定要用stop 啊,否则会死循环的.

已有 1 人评分经验 论坛币 收起 理由
bakoll + 3 + 3 精彩帖子

总评分: 经验 + 3  论坛币 + 3   查看全部评分

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

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