楼主: liu022
3828 8

SAS 双set的问题 [推广有奖]

  • 0关注
  • 6粉丝

已卖:181份资源

讲师

64%

还不是VIP/贵宾

-

威望
0
论坛币
879 个
通用积分
7.4013
学术水平
23 点
热心指数
18 点
信用等级
21 点
经验
3667 点
帖子
430
精华
1
在线时间
375 小时
注册时间
2007-5-21
最后登录
2025-10-22

楼主
liu022 发表于 2015-10-15 23:03:47 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币
大家好!我想请教一个双Set的问题:
数据集A 和B ,A\B有两个变量:t  price  结构如下:
A
t                                    price
2015-01-03                       3
2015-01-07                       2
......






B
t                                     price
2015-01-04                       8
2015-01-06                       9
.......




我想对A中每天价格,找到B中Price比A中Price高3倍,并且时间最近的记录。

请问双set语句或者SQL语句如何实现?

我觉得用SQL会形成一个很大的笛卡尔数据集,运算速度慢,倾向于用双Set来实现。


二维码

扫码加我 拉你入群

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

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

关键词:Set Price sql语句 Rice 如何实现 price

沙发
sas那个石家庄人 发表于 2015-10-16 00:08:43
  1. data one;
  2. input day price;
  3. cards;
  4. 1 10
  5. 2 45
  6. 3 14
  7. 4 15
  8. 5 16
  9. ;;;

  10. data two;
  11. input day price;
  12. cards;
  13. 1 41
  14. 2 19
  15. 3 90
  16. 4 10
  17. 5 120
  18. 6 100
  19. ;;;
  20. run;

  21. proc sql noprint;

  22. create table three as
  23. select one.day,one.price,(two.day) as day2, (two.price) as price2,abs(day2-one.day) as dif
  24. from one, two
  25. where price2 > 4*one.price
  26. group by one.day
  27. having dif = min(dif);

  28. quit;
复制代码



双set不知道怎么弄这个问题 我也想看看高手是怎么做的 坐等

藤椅
teqel 发表于 2015-10-16 06:14:00 来自手机
Sql做这个是强项。set能做,但是复杂

板凳
孤单的我们 发表于 2015-10-16 09:43:53
  1. data one;
  2. input day1 yymmdd10. price1;
  3. format day1 yymmdd10.;
  4. cards;
  5. 2015-01-03 3
  6. 2015-01-07 2
  7. ;
  8. run;
  9. data two;
  10. input day2 yymmdd10. price2;
  11. format day2 yymmdd10.;
  12. cards;
  13. 2015-01-04 8
  14. 2015-01-06 9
  15. ;
  16. run;


  17. data three;
  18.         set two;
  19.         do while ( not (abs(day2-day1)<=3 & price2>=3*price1>0 ) );
  20.         set one;
  21.         end;
  22. run;
复制代码
目前双set实现:日期相差3天之内,价格在3倍及之上。
距离时间最近,需要高人来解答。
学习是永无止境的。

报纸
teqel 发表于 2015-10-16 10:36:34
sas那个石家庄人 发表于 2015-10-16 00:08
双set不知道怎么弄这个问题 我也想看看高手是怎么做的 坐等
很好。一点意见,用left join可能更好一点
已有 1 人评分论坛币 收起 理由
admin_kefu + 10 热心帮助其他会员

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

地板
teqel 发表于 2015-10-16 10:40:50
孤单的我们 发表于 2015-10-16 09:43
目前双set实现:日期相差3天之内,价格在3倍及之上。
距离时间最近,需要高人来解答。
程序很好。不过应该比sql要慢。
至于选最近,可能一步做不出来,要把三天以内所有达标的都记下来,然后再选最小的一个

7
johnpark1 发表于 2015-10-18 16:37:46
This is what I would do. Basically expand each row on dataset 2 into 7 rows, to matching 3 days before and after the first dataset. Then you keep observations satisfies the price differences, and then you keep the closest.

** You expand the second dataset;
data DataTwo_c;
set datatwo(rename=(date=date0));
do diff = -3 to 3 by 1;
date = date0 + diff;
output;
end;

* You merge two datasets;
data DataOneTwo;
  merge DataOne DataTwo_c(rename=(price=price2));
  by date;
  if price2 >= 3 * price;
  diff = abs(diff);
run;

* you find the closest date;
proc sort data=dateOneTwo; by date diff; run;
data dateOneTwo; set DateOneTwo; by date; if first.date; run;
已有 1 人评分论坛币 收起 理由
admin_kefu + 30 热心帮助其他会员

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

8
teqel 发表于 2015-10-19 00:06:53
johnpark1 发表于 2015-10-18 16:37
This is what I would do. Basically expand each row on dataset 2 into 7 rows, to matching 3 days befo ...
这个做法很有意思。有一个改正:
date = date0 + diff;

9
johnpark1 发表于 2015-10-19 01:02:24
teqel 发表于 2015-10-19 00:06
这个做法很有意思。有一个改正:
date = date0 + diff;
Thanks for catching the  bug. Fixed in my original post.

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

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