楼主: congmu
3269 5

sql混合子查询问题 [推广有奖]

  • 2关注
  • 0粉丝

已卖:1147份资源

硕士生

42%

还不是VIP/贵宾

-

威望
0
论坛币
3931 个
通用积分
24.4704
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
1689 点
帖子
95
精华
0
在线时间
210 小时
注册时间
2012-10-25
最后登录
2024-7-31

楼主
congmu 发表于 2014-5-2 14:17:21 |AI写论文
10论坛币

数据集a   股票市场数据
code          qdate                 qtime                                    price
000001     2005-09-09       09SEP2005:09:49:27           ...
000001     2005-09-09       09SEP2005:09:59:27           ...
000001     2005-09-10        .......
000001     2005-09-10       ........
000001     2005-09-11        ........
...
000001



数据集b   股票除息日数据
code           exdt
000001     2005-09-10
000001     2005-10-12
000002     2006-02-03
.........

我需要剔除每个除息日前后3天的股票市场数据
我是这么做的,出错了
我对数据集进行了如下操作,变成了数据集c

code           exdt                  downdate         update
000001     2005-09-10        2005-09-07     2005-09-13
000001     2005-10-12        2005-10-09     2005-10-15
000002     2006-02-03        2006-01-31     2006-02-06
.........


  1. proc sql;
  2. create table ab as
  3. select * from a
  4. where qdate not between (select downdate from c where a.code=c.code) and (select update from c where a.code=c.code);
  5. quit;
复制代码
提示的错误是子查询求值不止一行。
求助应该怎么实现?





最佳答案

关键词:sql 子查询 proc sql Between Select 股票市场

沙发
jeozu 发表于 2014-5-2 14:17:22
  1. proc sql noprint;
  2. create table a0 as
  3. select distinct code
  4.      , qdate
  5. from a
  6. order by code, qdate
  7. ;
  8. quit;

  9. data a1;
  10. set a0;
  11. by code;
  12. if first.code then _day=0;
  13. _day+1;
  14. run;
  15. proc sql noprint;
  16. create table final as
  17. select code
  18. , qdate
  19. , qtime
  20. , price
  21. from (
  22.     /* if table is too large, use date step with hash */
  23.     select a.*
  24.     , bb.code  as expcode
  25.     from a left join
  26.     (
  27.         /*create 7 day window for each stock*/
  28.         select a1.code, a1.qdate
  29.         from a1 inner join (
  30.             /* attach op-day index to exdate */
  31.             select c.code, c.exdt, a1._day
  32.             from c left join a1 on c.code=a1.code)bb
  33.         on a1.code=bb.code
  34.         and abs(a._day-bb._day) le 3
  35.     )bb
  36.     on a.code=bb.code
  37.     and a.qdate=bb.qdate
  38.     )
  39. where expcode is missing
  40. ;
复制代码
已有 1 人评分论坛币 收起 理由
admin_kefu + 100 热心帮助其他会员

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

藤椅
congmu 发表于 2014-5-2 14:53:09
是我表述的不清晰吗?我需要剔除数据集a里日期在数据集b日期exdt前后3天的数据

板凳
jeozu 发表于 2014-5-2 15:00:06
你sql里的问题比较多,究其原因,还是没有把所有的key匹配上。
另外,金融市场的时间都是按照特殊的金融日历算的,一般每年末专门的部门会生成下一年的交易日日历。所以,不能按照正常的加减。不过,因为你是历史分析,所以直接在元数据表中找就行了。

报纸
congmu 发表于 2014-5-2 15:26:16
jeozu 发表于 2014-5-2 15:00
你sql里的问题比较多,究其原因,还是没有把所有的key匹配上。
另外,金融市场的时间都是按照特殊的金融日 ...
当看到大神连用三个连接后,我泪流满面了,回去仔细研究去。。。。

地板
jeozu 发表于 2014-5-2 15:39:18
congmu 发表于 2014-5-2 15:26
当看到大神连用三个连接后,我泪流满面了,回去仔细研究去。。。。
把sub-query当成临时表就行了,直接替换。如果与数据库打交道,一般没有权限生成新表,所以只能多用sub-query,20多个近3000行的单个sql也写过~~. 不能建临时表很多时候影响效率。

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

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2026-1-22 02:35