php – 完成:对于Z公司,计算A超过X天的平均值.我现在如何:对于
(我将首先解释我的问题.下表(任何示例查询)可在
http://sqlfiddle.com/#!2/8ec17/4获得)
我有一张包含股票信息的表格,如下: 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) 在这个例子中有5个_dates,所以必须连续几天连续几天: > 2011-03-16,2011-03-17,2011-03-18 回到我需要的东西: >前三天,“赢家”是公司2,平均公牛为(3.07 2.09 0.91)/ 3 = 2.0233,第3天返回-0.12.对于其他2个“日期范围”,获胜者是公司4(平均公牛力为2.14,回报率为0.50)和公司2公司(公牛力量为1.67,回报率为1.10) 问题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天的返回值. 谁可以帮助我解决我在这里遇到的一些问题?任何帮助是极大的赞赏 :-)
以下查询对您要执行的操作有很大帮助.它计算3天平均值,然后在每个日期内按最高平均值排序:
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小提琴.仅仅因为理由,我会提出这个问题. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |