请选择 进入手机版 | 继续访问电脑版
楼主: 2008310148
3951 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 |显示全部楼层 |坛友微信交流群

+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)应该是最后的那天吧?是其中一天的前后三十天啊

使用道具

林嘉祥 发表于 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耳!

使用道具

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;

使用道具

2008310148 发表于 2009-3-12 18:58:00 |显示全部楼层 |坛友微信交流群

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

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

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

使用道具

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
拉您进交流群

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

GMT+8, 2024-4-19 09:59