我有一张包含股票信息的表格,如下:
sp100_id _date bullishness returnpct ---------------------------------------------- 1 2011-03-16 1.01 -0.33 1 2011-03-17 0.85 -1.28 1 2011-03-18 0.89 1.25 1 2011-03-21 1.46 1.21 1 2011-03-22 0.39 -2.53 2 2011-03-16 3.07 1.27 2 2011-03-17 2.09 -0.80 2 2011-03-18 0.91 -0.12 2 2011-03-21 1.50 0.00 2 2011-03-22 2.62 1.10 3 2011-03-16 0.73 -1.13 3 2011-03-17 1.13 1.21 3 2011-03-18 1.12 0.45 3 2011-03-21 1.00 1.01 3 2011-03-22 1.00 -0.53 4 2011-03-16 0.40 1.10 4 2011-03-17 2.40 0.03 4 2011-03-18 3.16 -0.10 4 2011-03-21 0.86 0.50 4 2011-03-22 1.00 0.10
我需要的是:
>连续3天,计算每家公司的平均看涨率(sp100_id)
>以平均看涨率最高的公司的第3天回报并存储它
>最后,通过将存储的returnpcts相加来计算总回报
在这个例子中有5个_dates,所以必须连续几天连续几天:
> 2011-03-16,2011-03-17,2011-03-18
> 2011-03-17,2011-03-18,2011-03-21(请注意,2011-03-19不在表中)
> 2011-03-18,2011-03-21,2011-03-22
回到我需要的东西:
>前三天,“赢家”是公司2,平均公牛为(3.07 2.09 0.91)/ 3 = 2.0233,第3天返回-0.12.对于其他2个“日期范围”,获胜者是公司4(平均公牛力为2.14,回报率为0.50)和公司2公司(公牛力量为1.67,回报率为1.10)
>应存储值-0.12,0.50,1.10
>总返回值将是-0.12 0.50 1.10 = 1.48,应该从查询(或脚本)返回
问题1:假设上面的例子,我的查询返回第1天returnpct(1.27)而不是第3天returnpct(-0.12).我怎么能改变这个?
问题2:在sqlfiddle中,我连续3天硬编码了第一组.我怎样才能自动化(可能使用PHP),这样我就不必手动输入所有查询?请注意,表格中缺少日期.在示例中,脚本应该只占用表中的下一个可用日期(因此在2011-03-18之后出现2011-03-21,而不是2011-03-19,因为它不在表中)
问题3:在示例中,我连续使用了3天,但理想情况下,可以轻松更改脚本以接受任何其他连续天数(例如,2个,4个或8个).因此,应分别存储第2天,第4天或第8天的返回值.
谁可以帮助我解决我在这里遇到的一些问题?任何帮助是极大的赞赏 :-)
SELECT s.sp100_id,s._date,(s.bullishness+splus1.bullishness+splus2.bullishness)/3 as avgb,splus2.returnpct FROM (select s3.*,(select min(_date) from stocks s4 where s4.sp100_id = s3.sp100_id and s4._date > s3.dateplus1 ) as dateplus2 from (select s.*,(select min(_date) from stocks s2 where s2.sp100_id = s.sp100_id and s2._date > s._date ) as dateplus1 from stocks s ) s3 ) s left outer join stocks splus1 on s.sp100_id = splus1.sp100_id and s.dateplus1 = splus1._date left outer join stocks splus2 on s.sp100_id = splus2.sp100_id and s.dateplus2 = splus2._date order by 2,3 desc
此时,使用MysqL变得单调乏味.在支持分析/窗口函数和“with”语句的数据库中,这将更容易(除了MysqL之外几乎所有数据库:例如,Oracle,Postgres,DB2,sql Server).
您可以使用单个查询在MysqL中执行(3),但这很痛苦.您可能希望在应用程序层中执行此操作.
顺便说一句,谢谢你设置一个sql小提琴.仅仅因为理由,我会提出这个问题.